1 文件上传
页面:
<body>
<!-- 必须是post的方式 -->
<form action="upload.action" method="post" enctype="multipart/form-data">
文件:<input type="file" name="file"/>
<input type="submit" value="上传"/>
</form>
</body>
请求处理类:
public class UploadAction extends ActionSupport {
//对应JSP页面中的name="file"
private File file;
//文件名,必须加
private String fileFileName;
//文件的类型,必须加
private String fileContentType;
private InputStream is;
private OutputStream os;
public String upload() throws IOException{
HttpServletRequest request=ServletActionContext.getRequest();
String path=request.getRealPath("/upload");//获取项目目录下的upload目录的路径
try {
is=new FileInputStream(file);
os=new FileOutputStream(new File(path,fileFileName));//创建目录和创建文件
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
byte[] buffer=new byte[200];
int len=0;
while((len=is.read(buffer))!=-1){
os.write(buffer, 0, len);
}
os.close();
is.close();
return Action.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;
}
}
页面中的name属性设置的值与类中的属性名称一一对应。
request.getRealPath("/upload");//获取项目目录下的upload目录的路径,将上传的文件放在该upload中。
struts.xml配置:
<struts>
<!-- 设置临时目录 -->
<constant name="struts.multipart.saveDir" value="E:/Docum"></constant>
<!-- 设置上传文件的最大大小必须大于等于maximumSize -->
<constant name="struts.multipart.maxSize" value="20971520"></constant>
<package name="default" extends="struts-default" namespace="/">
<action name="upload" class="cn.sxt.action.UploadAction" method="upload">
<result>/index.jsp</result>
<!-- 拦截器 -->
<interceptor-ref name="fileUpload">
<!-- 设置文件最大值 -->
<param name="maximumSize">20971520</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"/>
</action>
</package>
</struts>
多个文件上传即为File数组。
页面:
<link rel="stylesheet" type="text/css" href="styles.css">
<script type="text/javascript" src="js/jquery-3.0.0.min.js"></script>
<script type="text/javascript">
$(function(){
$('#btn').click(function(){
var field="<p><input type='file' name='file'/><input type='button' value='删除' onclick='removed(this);'/></p>"
$('#files').append(field);
});
});
function removed(o){
$(o).parent().remove();
}
</script>
</head>
<body>
<!-- 必须是post的方式 -->
<form action="upload.action" method="post" enctype="multipart/form-data">
文件:<input type="file" name="file"/><input type="button" id="btn" value="添加">
<div id="files"></div>
<input type="submit" value="上传"/>
</form>
</body>
请求处理类:
package cn.sxt.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.Action;
public class BatchUploadAction {
private File[] file;
private String[] fileFileName;
private String[] fileContentType;
public String execute() throws IOException {
HttpServletRequest request = ServletActionContext.getRequest();
String path = request.getRealPath("/upload");
for (int i = 0; i < file.length; i++) {
InputStream is = new FileInputStream(file[i]);
OutputStream os = new FileOutputStream(new File(path, fileFileName[i]));
byte[] buffer = new byte[200];
int len = 0;
while ((len = is.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
os.close();
is.close();
}
return Action.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;
}
}
struts.xml配置:
<action name="batch" class="cn.sxt.action.BatchUploadAction">
<result>/index.jsp</result>
<interceptor-ref name="fileUpload">
<param name="maximumSize">20971520</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"/>
</action>
2 文件的下载:
2.1 获取response,通过输入输出来下载文件。
请求处理器
public class DownloadAction {
public String execute() throws IOException{
HttpServletRequest req=ServletActionContext.getRequest();
HttpServletResponse resp=ServletActionContext.getResponse();
//获取路径
String path=req.getRealPath("/download");
File file=new File(path,"dema1.txt");
resp.setContentLength((int)file.length());
resp.setCharacterEncoding("utf-8");
resp.setContentType("application/octet-stream");
resp.setHeader("Content-Disposition","attachment;filename='dema1.txt'");
byte[] buffer=new byte[400];
int len;
InputStream is=new FileInputStream(file);
OutputStream os=resp.getOutputStream();
while((len=is.read(buffer))!=-1){
os.write(buffer, 0, len);
}
os.close();
is.close();
return null;
}
}
配置信息
<!-- 当action处理的方法返回空是不用配置结果集 -->
<action name="download" class="cn.sxt.action.DownloadAction">
</action>
2.2 未知的方式。
请求处理类
public class StreamDownloadAction {
private String fileName;
public String execute(){
return Action.SUCCESS;
}
public InputStream getInputStream() throws IOException{
HttpServletRequest req=ServletActionContext.getRequest();
//获取路径
String path=req.getRealPath("/download");
return new FileInputStream(new File(path,fileName));
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
}
配置信息
<action name="streamDownload" class="cn.sxt.action.StreamDownloadAction">
<result type="stream">
<param name="inputName">inputStream</param>
<param name="contentDisposition">attachment;filename=${fileName}</param>
</result>
</action>