版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ScongHW/article/details/82990668
一、 文件上传
Struts2文件上传时,要使用Struts的标签<s:file />
例如:(以下的代码是一个小项目中的一部分,只给出文件上传下载部分代码,了解思想即可)
文件上传视图:
<s:form namespace="/" action="ClassesAction_upload" enctype="multipart/form-data">
<s:hidden name="classId" value="%{classId}"></s:hidden>
<table width="88%" border="0" class="emp_table" style="width:80%;">
<tr>
<td>选择课表:</td>
<td> </td>
<td> </td>
</tr>
<tr>
<td colspan="3">
<s:file name="schedule" ></s:file>
</td>
</tr>
</table>
</s:form>
- 表单中的文件格式类型enctype,要设置成"multipart/form-data"
- 文件上传的标签<s:file name=""/>
实现部分:
@InputConfig(resultName="uploadInput")
public String upload() throws IOException{
//1. 获得存放文件的目录
String parentDir = ServletActionContext.getServletContext().getRealPath("/WEB-INF/upload");
//2. 随机名称
String fileName = UUID.randomUUID().toString().replace("-", "")+scheduleFileName;
//3. 保存文件
FileUtils.copyFile(schedule, new File(parentDir,fileName));
//将数据保存在数据库classes表中
classes.setUploadFilename(scheduleFileName);
classes.setUploadTime(new Date());
classes.setUploadPath("/WEB-INF/upload/"+fileName);
//4. 更新
this.classesService.updateUpload(classes);
return "upload";
}
二、 文件下载
实现代码(action)
//写入流(要有get/set方法)
private InputStream inputStream;
//文件名(也要写get/set方法)
private String filename;
public void setInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}
public InputStream getInputStream() {
return inputStream;
}
public void setFilename(String filename) {
this.filename = filename;
}
public String getFilename() {
return filename;
}
public String download() throws Exception{
CrmClasses downloadClasses = this.classesService.findById(classes);
filename = downloadClasses.getUploadFilename();
String filePath = downloadClasses.getUploadPath();
if(filename==null){
return "uploadInput";
}
String userAgent = ServletActionContext.getRequest().getHeader("user-agent").toLowerCase();
if(userAgent.contains("mise")||userAgent.contains("like gecko")){
filename = URLEncoder.encode(filename,"utf-8");//将不安全的文件名改为utf-8 IE
}else{
filename = new String(filename.getBytes("utf-8"),"iso8859-1"); //非IE
}
String realpath = ServletActionContext.getServletContext().getRealPath(filePath);
inputStream = new FileInputStream(realpath);
return "success";
}
在Struts.xml文件中设置视图
<result type="stream">
<param name="contentType">application/octet-stream</param>
<param name="inputName">inputStream</param>
<param name="contentDisposition">attachment;filename=${filename}</param>
</result>
- contentType : 文件的下载类型,通常情况下,设置为“application/octet-stream”即可,如果想设置成其他值可以参考:http://tool.oschina.net/commons
- inputName : 得到action中文件输入流
- contentDisposition : 得到下载的文件的名称