您的位置:首页 > 编程语言 > Java开发

struts2 实现简单的文件上传、下载功能

2017-11-05 17:34 639 查看

一、使用 commons-fileupload.jar 实现文件上传

1.1 commons-fileupload.jar 简介

Commons FileUpload 是 Apache Commons 下的一个子项目,commons-fileupload 包能够让你的 servlet 和 web 应用能够很方便的实现健壮的、高性能的文件上传功能。

FileUpload 可以解析 HTTP 请求。如果一个 HTTP 请求使用 POST 方式提交,且该请求的内容类型标识为 “multipart/form-data” ,那么 FileUpload 就可以解析这个请求,并且使得到的结果更容易被程序所使用。

发送 “multipart/form-data” 请求的最简单的方法是通过页面表单提交请求。

<!-- 注:页面文件上传表单, method 属性必须为 "post",且编码类型 enctype 属性必须是 "multipart/form-data",任何语言都需要满足这两点。-->
<form  action="fileUpload.action" method="post" enctype="multipart/form-data">
file: <input type="file" name="file"> <br>
username: <input type="text" name="username"><br>
<input type="submit" value="sumit">
</form>


1.2 在 servlet 类中使用Commons-fileupload 实现简单的文件上传

public class UploadServlet extends HttpServlet{

private static final long serialVersionUID = 1L;

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
DiskFileItemFactory factory = new DiskFileItemFactory();
String path = req.getRealPath("/fileUp");
//指定大文件的临时存放目录
factory.setRepository(new File(path));
//设置大文件的最小大小,默认为10K,设置单位为字节,现在设置的大小为1G
factory.setSizeThreshold(1024*1024);

ServletFileUpload upload = new ServletFileUpload(factory);

try{
//list 集合里不但存放了上传的文件信息,还存放表单的其他类型请求的信息
List<FileItem> list = upload.parseRequest(req);

for(FileItem item:list){
String name = item.getFieldName();
//判断是否为普通的表单内容
if(item.isFormField()){
String value = item.getString();
System.out.println(name+"="+value);
req.setAttribute(name, value);
}else{
//获取文件名,有些浏览器会包括路径,如opera浏览器
String value = item.getName();
//如果忽略opera浏览器则不需要删除路径的操作
int start = value.lastIndexOf("\\");
String fileName = value.substring(start+1);

req.setAttribute(name, fileName);
//item.write完成上传文件写入服务器指定目录的工作,且会自动删除临时文件
//                  item.write(new File(path,fileName));

//如果需要自己实现写入硬盘的操作,需要删除临时文件
OutputStream os = new FileOutputStream(new File(path,fileName));
InputStream is = item.getInputStream();

byte[] buffer = new byte[400];
int length = 0;
while((length = is.read(buffer))!= -1){
os.write(buffer, 0,length);
}
is.close();
os.close();
}

}
}catch(Exception e){
e.printStackTrace();
}
//将请求转发给fileUploadResult.jsp结果页面
req.getRequestDispatcher("/fileUp/fileUploadResult.jsp").forward(req, resp);;
}
}


二 使用 struts2 实现文件上传功能

struts2 没有自己的文件上传实现,它仅仅是封装了common-fileupload 等第三方的文件上传的工具。

struts2 中在 default.properties 文件中设置了默认的最大上传文件大小为2M:

struts.multipart.maxSize=2097152(单位:byte,字节)

可在程序中创建struts.properties,或者在 struts.xml 中重新制定该属性的大小:

#在struts.properties中设置最大文件上传大小为1G
struts.multipart.maxSize=1073741824

<!-- 在struts.xml中设置最大文件上传大小为1G -->
<constant name="struts.multipart.maxSize" value="1073741824"></constant>


struts2 实现文件上传功能的示例:

public class UploadAction extends ActionSupport {

private String username;
//struts2会自动将上传的文件转换为File对象,使用file.getName()会获得临时文件的文件名
private File file;
//获得上传文件的文件名,不能用file.getName获得。
//且其命名规则中file为上传文件的表单的name属性值,加"FileName";
private String fileFileName;
//获得上传文件的类型
//命名规则:上传文件的表单的name属性值,加"FileName"
private String fileContentType;

//对于多文件上传可设置List类型属性或多个满足命名规则的不同属性:
//private List<File> file;
//private List<String> fileFileName;
//private List<String> fileContentType;
@Override
public String execute() throws Exception {
String root = ServletActionContext.getRequest().getRealPath("/fileUp");
System.out.println(root);
InputStream is = new FileInputStream(file);
System.out.println("fileFileName: "+fileFileName);
File destFile = new File(root,fileFileName);

OutputStream os = new FileOutputStream(destFile);

byte[] buffer = new byte[400];
int length = 0;
while(-1 != (length = is.read(buffer))){
os.write(buffer,0,length);
}
is.close();
os.close();

return SUCCESS;

}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
public String getFileFileName() {
return fileFileName;
}
public void setFileFileName(String fileFileName) {
this.fileFileName = fileFileName;
}
public String getFileContentType() {
return fileContentType;
}
public void setFileContentType(String fileContentType) {
this.fileContentType = fileContentType;
}
}


三、struts2 实现下载功能

struts2 实现下载实例一:

// DownloadAction.java
public class DownloadAction extends ActionSupport {

// 用于动态生成下载的文件名
private String filename;

public String getFilename() {
return filename;
}

public void setFilename(String filename) {
this.filename = filename;
}

//主要的执行方法
public InputStream getDownloadFile(){
//如果输入的是中文名文件,不做处理在页面上显示会出现乱码的情况
//需要做如下处理:this.filename = new String("中文.txt".getBytes("gbk"),"8859_1");gbk为操作系统默认编码,8859_1是http协议要求编码
//参考资料:http://jiapumin.iteye.com/blog/1006144
this.filename = "haha.txt";
return ServletActionContext.getServletContext().getResourceAsStream("/download/xxx.txt");
}

@Override
public String execute() throws Exception {
return SUCCESS;
}
}

<!-- struts.xml -->
<package name="struts2" extends="struts-default" namespace="/">
<action name="downloadFile" class="com.struts2.download.DownloadAction">
<!-- "contentDisposition" 属性为http协议的一个属性
"attachment;"不加的话默认为 inline ,当下载的文件,浏览器判定可以打开时会自动打开,不会跳出下载框
filename="xxx" 的值会决定浏览器下载时文件的文件名
filename=${filename} 动态生成下载文件显示的文件名
inputName的值会使程序执行action中的get+属性值的方法,示例中即为 getDownloadFile 方法。
-->

<result type="stream">
<param name="contentDisposition">attachment;filename=${filename}</param>
<param name="inputName">downloadFile</param>
</result>
</action>
</package>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: