使用action 实现单文件的上传和下载
使用 struts2实现文件上传和下载相比于Servlet 简单很多
文件下载:
将type的类型修改为 stream ;
增加几个参数:
contentType:发送到浏览器的MIME类型 决定了下载的文件的类型 通常设为application/octet-stream就可以了
contentLength:设置文件的大小
contentDisposition:设置响应的HTTP头信息中的Content-Disposition参数的值 由两部分组成,例如:attachment 表示 下载时弹出对话框提示用户保存或者直接打开文件,后一部分表示文件的名字,中间使用 ; 隔开
inputName:指定Action中提供的inputStream类型的属性名称
bufferSize:设置读取和下载文件时的缓冲区大小
Action中要有一个inputStream类型的属性 :下载文件使用的输入流
contentType对应的文件类型
文件类型 | contentType设置 |
---|---|
Word | application/msword |
Excel | Application/vnd.ms-excel |
PPT | Application/vnd.ms-powerpoint |
图片 | image/gif , image/bmp , image/jpeg |
文件文件 | text/plain |
HTML网页 | text/hml |
可执行文件 | application/octet-stream 通常就用这个就可以 |
jsp:
<!-- Struts2 下载文件 -->
<a href="<%=request.getContextPath()%>/download.action" class="down">Struts2文件下载</a>
js:
/**
* 文件下载
*/
$(function(){
$(".down").click(function(){
//获取href
var url = $(this).attr("href");
//发送post请求
window.open(url,"文件下载");
return false;
});
});
struts.xml
<!-- 文件下载Action -->
<action name="download" class="mxc.sky.action.DownLoadAction">
<result name="success" type="stream">
<!-- 下载的文件的类型 -->
<param name="contentType">application/octet-stream</param>
<!-- Action中的输入流的名称 -->
<param name="inputName">inputStream</param>
<!-- response中头信息的 Content-Disposition 参数的值 filename指定文件的名字-->
<param name="contentDisposition">attachment;filename=${fileName}</param>
<!-- 指定文件下载的缓冲区的大小 -->
<param name="bufferSize">4096</param>
</result>
</action>
action
package mxc.sky.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import org.apache.struts2.ServletActionContext;
/**
* 实现文件下载
* @author sky-mxc
* @date 2016年7月9日 下午6:25:55
*/
public class DownLoadAction implements Serializable {
//名字要和 配置文件中的对应
private InputStream inputStream = null;
//文件名称
private String fileName = null;
/**
* 实现下载
* 找到文件
* 获取文件名称(ps:进行中文乱码处理)
* 将文件读入输入流
* @author sky-mxc
* @Date 2016年7月9日下午6:39:34
* @return
*/
public String execute(){
String filePath = ServletActionContext.getServletContext().getRealPath("file/孟jquery-1.8.3.js");
System.out.println("debug********FilePath:"+filePath);
File file = new File(filePath);
//对文件名进行中文乱码处理
try {
fileName= new String(file.getName().getBytes("utf-8"),"iso-8859-1");
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//输入流读取文件
try {
inputStream= new FileInputStream(file);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "success";
}
public InputStream getInputStream() {
return inputStream;
}
public void setInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
}
文件上传
需要用到的jar包:commons-fileupload-x.x.jar,commons-io-X.x.x.jar
struts2在action中使用3个属性封装文件信息
File类型的xxx属性:与表单中的File控件的name属性一致,用于封装对应的文件
String类型xxxFileName:名称由前面的File类型属性和FileName组合而成,是固定的语法,封装文件的名字
String类型 xxxContentType:名称同样是组合而成,固定语法,封装文件的文件类型
action:
package mxc.sky.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.Serializable;
import java.net.URLEncoder;
import org.apache.commons.io.IOUtils;
import org.apache.struts2.ServletActionContext;
/**
* 实现文件上传
* @author sky-mxc
* @date 2016年7月9日 下午6:57:44
*/
public class UploadAction implements Serializable {
//文件
private File upload = null;
//文件类型
private String uploadContentType = null;
//文件名称
private String uploadFileName = null;
private String message = null;
public String execute() throws IOException{
System.out.println("--------File:"+upload);
System.out.println("--------fileContentType:"+uploadContentType);
System.out.println("--------FileName:"+this.uploadFileName);
//存储路径
String savePth = ServletActionContext.getServletContext().getRealPath(this.uploadFileName);
System.out.println("--------FilePath:"+savePth);
FileInputStream fis = new FileInputStream(upload);
FileOutputStream fos = new FileOutputStream(savePth);
IOUtils.copy(fis, fos);
fos.flush();
fos.close();
fis.close();
message=URLEncoder.encode("上传路径:"+savePth,"utf-8") ;
return "success";
}
public File getUpload() {
return upload;
}
public void setUpload(File upload) {
this.upload = upload;
}
public String getUploadContentType() {
return uploadContentType;
}
public void setUploadContentType(String uploadContentType) {
this.uploadContentType = uploadContentType;
}
public String getUploadFileName() {
return uploadFileName;
}
public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
strust.xml:
<!-- 文件上传 -->
<action name="upload" class="mxc.sky.action.UploadAction">
<result name="success" type="redirect">/result.jsp?message=${message}</result>
<interceptor-ref name="fileUpload">
<param name="maxinumSize">50000000000000</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
jsp:
<!-- struts2上传 -->
<form name="frmFileUpload" action="<%=request.getContextPath()%>/upload.action" method="post" enctype ="multipart/form-data">
<input type="file" name="upload"/>
<button type="submit">Struts2上传</button>
</form>
关于文件上传下载(含注解版下载)的Demo地址:https://github.com/sky-mxc/FileUploadAndDownLoad