java中struts2实现文件上传下载功能
作者:GYW 发布时间:2021-11-16 19:53:47
标签:Struts2,上传,下载
先谈一谈struts2实现文件的上传和下载实例实现的原理:
Struts 2是通过Commons FileUpload文件上传。
Commons FileUpload通过将HTTP的数据保存到临时文件夹,然后Struts使用fileUpload * 将文件绑定到Action的实例中。从而我们就能够以本地文件方式的操作浏览器上传的文件。
具体实现:
一、创建index.jsp页面
<body>
<s:form action="upload" method="post" theme="simple" enctype="multipart/form-data">
<table align="center" width="50%" border="1">
<tr>
<td>选择上传文件</td>
<td id="more">
<s:file name="file"></s:file>
<input type="button" value="Add More.." onclick="addMore()">
</td>
</tr>
<tr>
<td><s:submit type="button" value="submit" onclick="return checkf()"/></td>
<td><s:reset value="reset "></s:reset></td>
</tr>
</table>
<table align="center" width="50%" border="1">
<tr>
<td>测试.txt</td>
<td>
<a href="<s:url value='download.action'><s:param name='fileName'>测试.txt</s:param> </s:url>">下载</a>
</td>
</tr>
</table>
</s:form>
</body>
创建result.jsp页面
<body>
<s:form>
<div style="border:1px solid black">成功上传的文件:<br>
<ul style="list-style-type:decimal">
<s:iterator value="#request.fileName" id="file" status="status">
<li><s:property/> </li>
</s:iterator>
</ul>
</div>
</s:form>
</body>
当然别忘了在每个页面上都添加上struts2 标签引用<%@taglib prefix="s" uri="/struts-tags" %>
二、创建updown.js文件,在index.jsp中引用
function checkf(){
var files = document.getElementsByName("file");
if(files[0].value.length!=0){
return true;
}else{
alert("请选择文件");
return false;
}
}
function addMore()
{
var td = document.getElementById("more");
var br = document.createElement("br");
var input = document.createElement("input");
var button = document.createElement("input");
input.type = "file";
input.name = "file";
button.type = "button";
button.value = "Remove";
button.onclick = function()
{
td.removeChild(br);
td.removeChild(input);
td.removeChild(button);
}
td.appendChild(br);
td.appendChild(input);
td.appendChild(button);
}
三、创建upDownloadAction.java
package com.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;
public class UpDownloadAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private List<File> file;// 对应jsp中file标签
private List<String> fileFileName;//
private List<String> fileContentType;//
private String fileName;//获得jsp中pram参数
@SuppressWarnings("deprecation")
// 文件上传
public String uploadFiile() throws Exception {
String root = ServletActionContext.getServletContext().getRealPath(
"/upload");// 上传路径
System.out.println(root);
InputStream inputStream;
File destFile;
OutputStream os;
for (int i = 0; i < file.size(); i++) {
inputStream = new FileInputStream(file.get(i));
destFile = new File(root, this.getFileFileName().get(i));
os = new FileOutputStream(destFile);
byte[] buffer = new byte[400];
int length = 0;
while ((length = inputStream.read(buffer)) > 0) {
os.write(buffer, 0, length);
}
inputStream.close();
os.close();
}
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute("fileName", fileFileName);
return SUCCESS;
}
// 文件下载
public InputStream getDownloadFile() throws FileNotFoundException,
UnsupportedEncodingException {
System.out.println(getFileName());
// 如果下载文件名为中文,进行字符编码转换
ServletActionContext.getResponse().setHeader("Content-Disposition","attachment;fileName="
+ java.net.URLEncoder.encode(fileName, "UTF-8"));
InputStream inputStream = new FileInputStream("F:/" //使用绝对路径 ,从该路径下载“测试.txt"文件
+ this.getFileName());
System.out.println(inputStream);
return inputStream;
}
// 下载
public String downloadFile() throws Exception {
return SUCCESS;
}
public String getFileName() throws UnsupportedEncodingException {
return fileName;
}
public void setFileName(String fileName)
throws UnsupportedEncodingException {
this.fileName = new String(fileName.getBytes("ISO8859-1"), "utf-8");
}
}
注:属性的 get和set方法已省略。
四、最后是配置文件
1、web.xml配置
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2、struts.xml配置
<struts>
<constant name="struts.i18n.encoding" value="utf-8"></constant>
<constant name="struts.multipart.saveDir" value="f:\"></constant>
<package name="struts2" extends="struts-default">
<action name="upload" class="com.action.UpDownloadAction" method="uploadFiile">
<result name="success">/jsp/result.jsp</result>
<interceptor-ref name="fileUpload">
<!--maximumSize (可选) - 这个 * 允许的上传到action中的文件最大长度(以byte为单位).
注意这个参数和在webwork.properties中定义的属性没有关系,默认2MB-->
<param name="maximumSize">409600</param>
<!--allowedTypes (可选) - 以逗号分割的contentType类型列表(例如text/html),
这些列表是这个 * 允许的可以传到action中的contentType.如果没有指定就是允许任何上传类型.-->
<param name="allowedTypes">
text/plain
</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
<action name="download" class="com.action.UpDownloadAction" method="downloadFile" >
<result name="success" type="stream">
<!--指定文件下载类型 application/octet-stream默认值可以下载所有类型 -->
<param name="contentType">
application/txt;
</param>
<!-- 指定下载的文件名和显示方式 ,但注意中文名的乱码问题,解决办法是:进行编码处理-->
<!--contentDisposition是文件下载的处理方式,包括内联(inline)和附件(attachment),
默认是inline, 使用附件时这样配置:attachment;filename="文件名" 。-->
<param name="contentDisposition">
attachment;filename="${fileName}"
</param>
<!--由getDownloadFile()方法获得inputStream-->
<param name="inputName">downloadFile</param>
<!-- 指定下载文件的缓存大小-->
<param name="bufferSize">2048</param>
</result>
</action>
</package>
</struts>
一个简单的Struts2多文件上传和单文件下载就实现了。


猜你喜欢
- 目录一 、递归算法简介二 、Fibonacci数列和阶乘1、 Fibonacci数列2、阶乘三 、汉诺塔问题 四 、排列组合1、输
- 场景网站智能问答场景,需要对多个分类查询,结果聚合展示由于每种分类都有自己的业务逻辑,有的需要查询数据库中间库,有的需要查询elastics
- 前端页面功能模块化拆分当一个系统的功能很多时,不可能所有功能模块的页面都写在一个页面里面,这时就需要将不同功能模块的页面拆分出去,就像模板一
- MongoDB是介于关系数据库和非关系数据库之间的一种产品,文件的存储格式为BSON(一种JSON的扩展),这里就主要介绍Java通过使用m
- 1.概述:C语言中的单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始。链表中最简单的一种
- 详解房卡麻将分析系列 "牌局回放" 之 播放处理 昨天红孩儿给大伙讲了讲”牌局回放“的数据记录处
- C++的函数指针(function pointer)是通过指向函数的指针间接调用函数。相信很多人对指向一般函数的函数指针使用的比较多,而对指
- 一. 概念简介在开始学习今天的知识之前,有必要先给大家讲解一下与今天内容相关的一些概念,否则可能会让一些小白产生迷惑。1. 日期和时间的区别
- 本文实例讲述了C#编程实现查看剪切板内容的方法。分享给大家供大家参考,具体如下:using System;using System.Coll
- 最新idea2020安装部署超详细教程懂得懂的2020.32020.2.42020.2.32020.2.220.2.12019.32018.
- BufferedReader读取文件指定字符集问题默认的读取方式BufferedReader bufferedReader = new Bu
- Android环境布置完毕,直接就是一个Helloworld程序,详情请看《利用adt-bundle轻松搭建Android开发环境与Hell
- 现在很多网站都有注册登录的页面,为了更好的满足用户体验和网站的安全性,很多网站都采用动态生成的图形码或者是附加码进行验证,下面把生成验证码的
- 前言最近项目需要和Oracle数据库进行交互,然后我从Maven中央仓库下载数据库驱动jar包,但怎么都下不下来,我到Oracle官网上一看
- 本文实例为大家分享了java实现五子棋游戏的具体代码,供大家参考,具体内容如下此游戏具有双人对战功能和人机对战功能一、游戏界面的实现一个游戏
- 问题引出:最近开了新项目,项目中用到了数据字典,列表查询数据返回的时候需要手动将code转换为name,到前台展示。项目经理表示可以封装一个
- 时间轮关于时间轮的介绍,网上有很多,这里就不重复了核心思想一个环形数组存储时间轮的所有槽(看你的手表),每个槽对应当前时间轮的最小精度超过当
- spring.thymeleaf.cache=false不起作用配置是清除缓存,实现热部署。也就是修改了html后不用重启,刷新页面就能看到
- 60年代,在OS中能拥有资源和独立运行的基本单位是进程,然而随着计
- 本文实例为大家分享了Android自定义View实现波浪动画的具体代码,供大家参考,具体内容如下效果演示代码调用与实现效果xml中调用<