基于struts2的文件上传下载
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于struts2的文件上传下载相关的知识,希望对你有一定的参考价值。
1.struts.xml
1 <struts> 2 <constant name="struts.multipart.maxSize" value="209715200" /><!-- 设置文件上传大小,2097152=2M --> 3 <package name="action" extends="struts-default" namespace="/"> 4 <!-- 文件上传 --> 5 <action name="upload" class="com.fileupload.action.UploadAction" method="execute"> 6 <result name="success">load_success.jsp</result><!-- 文件上传成功后跳转页面 --> 7 <result name="message">/message.jsp</result><!-- 上传失败跳转页面 --> 8 <interceptor-ref name="defaultStack"> 9 <param name="fileUpload.allowedExtensions">jpg,png</param><!-- 设置上传格式 --> 10 </interceptor-ref> 11 </action> 12 <!-- 文件下载 --> 13 <action name="download" class="com.fileupload.action.DownloadAction" method="execute"> 14 <result type="stream"> 15 <param name="inputName">is</param> <!-- 指定返回流的名字 --> 16 <param name="contentType">application/pdf/jpg</param><!-- 指定返会数据的类型 --> 17 <param name="contentDisposition">attachement;filename=${fileName}</param><!-- 指定用户下载的文件的类型和名称 --> 18 </result> 19 </action> 20 </package> 21 </struts>
2.上传action
1 import java.io.File; 2 import java.io.IOException; 3 import org.apache.commons.io.FileUtils; 4 import org.apache.struts2.ServletActionContext; 5 6 public class UploadAction { 7 private File img; //文件 8 private String imgFileName; //文件名:文件+FileName 9 10 public String execute() throws IOException{ 11 12 if(img != null){ 13 String path = ServletActionContext.getServletContext().getRealPath("/images"); 14 File destFile = new File(path, imgFileName); 15 FileUtils.copyFile(img, destFile); 16 return "success"; 17 } 18 return "message"; 19 } 20 21 public File getImg() { 22 return img; 23 } 24 public void setImg(File img) { 25 this.img = img; 26 } 27 public String getImgFileName() { 28 return imgFileName; 29 } 30 public void setImgFileName(String imgFileName) { 31 this.imgFileName = imgFileName; 32 } 33 }
3.下载action
import java.io.FileNotFoundException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import org.apache.struts2.ServletActionContext; public class DownloadAction { private InputStream is; //输入流,先将文件读入服务端的内存 private String fileName; //随意 public String execute() throws FileNotFoundException, UnsupportedEncodingException{ fileName = "1.png";//设置路径,在项目中通过连接DB获取文件名 fileName = new String(fileName.getBytes("iso-8859-1"),"UTF-8");//设置编码 is = ServletActionContext.getServletContext().getResourceAsStream("/images/"+fileName);//获得文件流 return "success"; } public InputStream getIs() { return is; } public void setIs(InputStream is) { this.is = is; } public String getFileName() { return fileName; } public void setFileName(String fileName) { this.fileName = fileName; } }
[注意]:
1. 下载时出现500:Can not find a java.io.InputStream with the name [is] in the invocation stack. Check the <param nam
解决思路:1)查看is输入流是否为null,若为空则没有获取到正确路径,检查文件名是否正确
2)在action中没有写配置文件中"<param name="inputName">"后面属性的那个get方法
3)当采用 return ServletActionContext.getServletContext().getResourceAsStream("...") 这种方法获得输入流的时候,要保证文件位置在 ServletContext 当中,就是说要在当前的应用上下文中,如果想要获得外部文件 譬如 D盘中的某个文件,那么就要自己创建输入流才可以,如:
File file = new File("D://spring.doc"); InputStream is = new FileInputStream(file); return is;
以上是关于基于struts2的文件上传下载的主要内容,如果未能解决你的问题,请参考以下文章
(27) java web的struts2框架的使用-基于表单的多文件上传