struts2上传下载文件所需jar包
上传下载类
FileUploadAction.java
package action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class FileUploadAction extends ActionSupport {
/**
* Struts2针对表单中名为xxx的文件域,在对应的Action类中使用3个属性来封装该文件域信息:
1.类型为File的xxx属性:用来封装页面文件域对应的文件内容。
2.类型为String的xxxFileName属性:用来封装该文件域对应的文件的文件名。
3.类型为String的xxxContentType属性:用来封装该文件域应用的文件的文件类型。
*/
private File file;
private String fileFileName;
private String fileContentType;
private String message;
private String fileSize;
// @Inject("struts.multipart.saveDir")
// @Inject("saveDir")
private String saveDir;
private List<File> files;
private List<String> filesFileName;
private List<String> filesContentType;
private List<String> filesSize = new ArrayList<String>();
private List list;
public String uploadAFile() throws Exception {
// String root = ServletActionContext.getServletContext().getRealPath("/upload");
InputStream is = new FileInputStream(file);
// fileSize = is.available()/1000 +"KB";
formatFileSize(is.available());
File f1 = new File(saveDir, fileFileName);
System.out.println(f1.getAbsolutePath());
OutputStream os = new FileOutputStream(f1);
System.out.println("fileName : " + fileFileName);
System.out.println("file content type : " + fileContentType);
System.out.println("File size: " + fileSize);
// System.out.println("===========================");
/**
* 下面两行code得到临时文件名和临时存放路径
*/
// System.out.println("file : " + file.getName());
// System.out.println("file : " + file.getPath());
byte []buffer = new byte[256];
int length = 0;
while((length = is.read(buffer, 0, buffer.length)) != -1){
os.write(buffer);
/*
* 给buffer重新分配空间
* 如果不重新分配空间,每次都会把下次的数据覆盖到缓存空间,
* 若最后剩下的数据不满足缓存空间的时候,先把最后的data 覆盖到前面的部分缓存区,
* 剩下未填满的区域任是上个data中保存的数据,会造成文件的内容和原本上传的文件不一样
*/
buffer = new byte[256];
}
os.close();
is.close();
// ActionContext.getContext().put("message", "upload Success.");
return SUCCESS;
}
public void formatFileSize(long fileSize){
double size = fileSize/1000.0;
DecimalFormat format = new DecimalFormat("#.##");
this.fileSize = format.format(size) + "KB";
}
public String uploadFiles() throws Exception {
for(int i=0;i<files.size();i++){
File file = files.get(i);
InputStream is = new FileInputStream(file);
String size = is.available()/1000 +"KB";
filesSize.add(size);
File fl = new File(saveDir, filesFileName.get(i));
OutputStream os = new FileOutputStream(fl);
System.out.println("File Name: " + filesFileName.get(i));
System.out.println("File Content Type: " + filesContentType.get(i));
byte []buffer = new byte[256];
int length = 0;
while((length = is.read(buffer, 0, buffer.length)) != -1){
os.write(buffer);
buffer = new byte[256];
}
os.close();
is.close();
}
return SUCCESS;
}
//返回一个输入流,作为一个客户端来说是一个输入流,但对于服务器端是一个 输出流
@SuppressWarnings("unchecked")
public InputStream getInputStream() throws Exception{
// ServletActionContext.getServletContext()
/*
* 转换文件名编码,否则遇到中文文件名会出现乱码
*/
fileFileName = new String(fileFileName.getBytes("ISO-8859-1"),"UTF-8");
System.out.println(fileFileName);
Object []objs = (Object[]) ActionContext.getContext().getSession().get("uploadFiles");
/*
* 从上传文件的文件夹中找到对应的文件的路径
*/
String filePath = null;
for(Object o : objs){
// String path = file.getAbsolutePath();
if(String.valueOf(o).contains(fileFileName)){
filePath = String.valueOf(o);
break;
}
}
/*
* 将文件名的编码转换成原先的编码,否则在下载的文件名处中文文件名显示可能会出问题
* struts2 在struts.xml 的配置中将文件名传到客户端
*/
fileFileName = new String(fileFileName.getBytes("UTF-8"),"ISO-8859-1");
InputStream is = new FileInputStream(filePath);
return is;
// return ServletActionContext.getServletContext().getResourceAsStream("upload/" + fileFileName);
}
public String listAllUploadFiles() throws Exception {
getListFilesInUploadFile();
return SUCCESS;
}
public List<File> getListFilesInUploadFile() throws IOException{
/*
* 将上传的文件路径保存到upload.properties中,download的时候从properties文件中读取路径
*/
InputStream is = this.getClass().getClassLoader().getResourceAsStream("upload.properties");
Properties p = new Properties();
p.load(is);
saveDir = String.valueOf(p.get("saveDir"));
File file = new File(saveDir);
list = Arrays.asList(file.list());
is.close();
ActionContext.getContext().getSession().put("uploadFiles", file.listFiles());
return Arrays.asList(file.listFiles());
}
public String downloadFile() throws Exception {
return SUCCESS;
}
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;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getSaveDir() {
return saveDir;
}
public void setSaveDir(String saveDir) {
this.saveDir = saveDir;
}
public List<File> getFiles() {
return files;
}
public void setFiles(List<File> files) {
this.files = files;
}
public List<String> getFilesFileName() {
return filesFileName;
}
public void setFilesFileName(List<String> filesFileName) {
this.filesFileName = filesFileName;
}
public List<String> getFilesContentType() {
return filesContentType;
}
public void setFilesContentType(List<String> filesContentType) {
this.filesContentType = filesContentType;
}
public String getFileSize() {
return fileSize;
}
public void setFileSize(String fileSize) {
this.fileSize = fileSize;
}
public List<String> getFilesSize() {
return filesSize;
}
public void setFilesSize(List<String> filesSize) {
this.filesSize = filesSize;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
}
Struts.xml
<!--解决乱码 -->
<constant name="struts.i18n.encoding" value="UTF-8" />
<package name="upload" namespace="/upload" extends="struts-default">
<global-results>
<result name="error">/error.jsp</result>
<result name="input">/error.jsp</result>
</global-results>
<action name="uploadAFile" class="action.FileUploadAction" method="uploadAFile">
<param name="saveDir">c:\tempUpload</param>
<result name="success">/upload/uploadSuccess.jsp</result>
</action>
<action name="uploadFiles" class="action.FileUploadAction" method="uploadFiles">
<!-- saveDir 上传文件路径 -->
<param name="saveDir">c:\tempUpload</param>
<result name="success">/upload/uploadFilesSuccess.jsp</result>
</action>
<action name="listAllUploadFiles" class="action.FileUploadAction" method="listAllUploadFiles">
<result name="success">/upload/listAllUploadFiles.jsp</result>
</action>
<action name="downloadFile" class="action.FileUploadAction" method="downloadFile">
<result name="success" type="stream">
<param name="contentType">application/octet-stream;charset=utf-8</param>
<param name="inputName">inputStream</param>
<param name="contentDisposition">attachment;filename="${fileFileName}"</param>
<param name="bufferSize">4096</param>
</result>
</action>
</package>
当result为stream类型时,struts2会自动根据你配置好的参数下载文件。
其中主要使用的参数是:
contentType 指定下载文件的文件类型 —— application/octet-stream 表示无限制
inputName 流对象名 —— 比如这里写inputStream,它就会自动去找Action中的getInputStream方法。
contentDisposition 使用经过转码的文件名作为下载文件名 —— 默认格式是attachment;filename=”${fileFileName}”,将调用该Action中的getFileFileName方法。
bufferSize 下载文件的缓冲大小
说明:
以上code 解决上传过程中比如中文、日文等乱码问题,可以上传任意文件。基本需要注意的都添加注释了。
但是对于生僻字仍旧是乱码,不知道什么原因。
从测试人员那得到的生僻字:(把生僻字放到文档中上传乱码,搞的眼疼也没找到原因,望指教)
ÇàâアイウДфэأبتثअइउ鯵㈱表噂ソ十豹竹敷~兎椄*@'愛金รื่ญูฏู鷗㐀葛渚噓������か゚啊☆€㐁ᠠﭖꀀༀ䨭抎駡U郂 鯵㈱表噂ソ十豹竹敷~兎椄*@'
~乱码问题搞得真难受,哎~