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

J2EE系列之Struts2学习笔记(二十二)--Struts2多文件上传和文件下载

2017-05-02 11:49 435 查看
上一篇博客中讲到了如何上传单个文件。现在说一下如何上传多个文件,这个非常简单与上传单个文件类似。直接以代码示例:

1.新建filesupload.jsp文件,作为上传多个文件的文件选择页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<s:fielderror></s:fielderror>
<form action="uploads" method="post" enctype="multipart/form-data">
文件1:<input type="file" name="filetest"/></br>
文件2:<input type="file" name="filetest"/></br>
文件3:<input type="file" name="filetest"/></br>
<input type="submit" value="提交"/>
</form>
</body>
</html>
2.新建处理类FilesUpladAction:
package com.test.action;

import java.io.File;

import org.apache.commons.io.FileUtils;

import com.opensymphony.xwork2.ActionSupport;

public class FilesUpladAction extends ActionSupport{

/**
*
*/
private static final long serialVersionUID = 1L;

private File[] filetest;//文件
private String[] filetestFileName;//文件名
private String[] filetestContentType;//文件类型

public File[] getFiletest() {
return filetest;
}

public void setFiletest(File[] filetest) {
this.filetest = filetest;
}

public String[] getFiletestFileName() {
return filetestFileName;
}

public void setFiletestFileName(String[] filetestFileName) {
this.filetestFileName = filetestFileName;
}

public String[] getFiletestContentType() {
return filetestContentType;
}

public void setFiletestContentType(String[] filetestContentType) {
this.filetestContentType = filetestContentType;
}

@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
for(int i=0; i<filetest.length; i++){

System.out.println("文件名:"+filetestFileName[i]);
System.out.println("文件类型:"+filetestContentType[i]);

String filePath = "C:/"+filetestFileName[i];
File saveFile = new File(filePath);
FileUtils.copyFile(filetest[i], saveFile);//把上传的文件搞到本地去,上传的文件是存储在缓存中的
}
return SUCCESS;
}

}


这里文件、文件名、文件类型变量都定义成了数组类型,命名方法与上传单个文件相同。
3.修改struts.xml配置文件:

<struts>
<constant name="struts.multipart.maxSize" value="20000000"></constant>
<package name="manager" extends="struts-default">

<action name="uploads" class="com.test.action.FilesUpladAction">
<result name="success">/success.jsp</result>
<result name="input">/filesupload.jsp</result>
</action>

</package>
</struts>

4.运行程序



选择3个文件,并点击提交按钮,文件上传成功。

上面讲述了文件上传,下面在说一下struts2如何实现下载功能。

struts2规定下载功能的处理函数中必须返回下载文件的文件流,并且处理函数名必须是InputStream getInputStream()。

1.新建下载功能处理类:FileDownLoadAction:

package com.test.action;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

import com.opensymphony.xwork2.ActionSupport;

public class FileDownLoadAction extends ActionSupport{

/**
*
*/
private static final long serialVersionUID = 1L;

private String fileName;

public String getFileName() throws Exception{
fileName = new String(fileName.getBytes(),"ISO8859-1");
return fileName;
}

public void setFileName(String fileName) {
this.fileName = fileName;
}

public InputStream getInputStream() throws Exception{
File file = new File("C:/美女1.jpg");
this.fileName = "美女1号.jpg";

return new FileInputStream(file);
}

}

这里定义了一个字符串变量fileName并生成了这个变量的get和set函数,这个变量代表下载后文件的名字。在getInputStream函数中指定了要下载的文件是C盘的美女1号.jpg,并定义了下载后的文件名字为美女1号.jpg,然后返回下载文件的文件流。
这里要注意的是fineName变量的get函数中使用了ISO8859-1编码进行了转换,这里是因为处理函数返回的文件流是以ISO8859-1编码进行传输的,所以get函数中要进行一下转码,否则的话该下载的文件的中文名会出现乱码。

2.写下载页面filedownload.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="download">文件下载</a>
</body>
</html>

这里直接进行请求,因为要下载的文件以及下载后文件的名字在处理函数中已经进行了定义。

3.写配置文件struts.xml

<struts>
<package name="manager" extends="struts-default">

<action name="download" class="com.test.action.FileDownLoadAction">
<result type="stream">
<param name="contentDisposition">attachment;filename=${fileName}</param>
</result>
</action>
</package>
</struts>

这里要注意的是<result>标签中返回的是stream文件流。<param name="contentDisposition">attachment;filename=${fileName}</param>中name属性的值为contentDisposition,会给浏览器提供一些下载信息,比如attachment会使浏览器弹出是否下载的询问,并把下载后的文件名添加到询问框中。

4.运行程序:



点击文件下载,会弹出下载问询框:



可以看到,这里的文件名是我们在处理函数中指定的文件名。

点击这里的下载按钮开始下载文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息