一、解决
1)文件中文名称容易出错的问题
2)对下载进行权限管理
二、基本原理:
直接链接到一个action里去,这个action执行后输出的结果类型是type="stream"类型。
三、实现方法
1)JSP
<a href="<%=basePath%>fileOp/download?fileName=1.png">图片文件下载</a>
2)action配置
<package name="/fileOp" extends="struts-default"> <action name="download" class="com.meetcomet.util.FileDownLoadAction"> <param name="path">/download</param> <result name="success" type="stream"> <param name="contentType"> image/bmp,image/x-png,image/gif,image/pjpeg </param> <!-- 文件下载的处理方式,包括内联(inline)和附件(attachment)两种方式,而附件方式会弹出文件保存对话框,否则浏览器会尝试直接显示文件。 --> <param name="contentDisposition"> attachment;filename=${fileName} </param> <param name="inputName">targetFileName</param> <!-- 缓冲区大小 --> <param name="bufferSize">2048</param> </result> <result name="error">/fail.jsp</result> </action> </package>
3)Action
1 public class FileDownLoadAction extends ActionSupport { 2 3 private String fileName; 4 private String path; 5 private InputStream targetFileName; 6 7 public String getFileName() { 8 return fileName; 9 } 10 11 public void setFileName(String fileName) { 12 this.fileName = fileName; 13 } 14 15 public String getPath() { 16 return ServletActionContext.getServletContext().getRealPath(path); 17 } 18 19 public void setPath(String path) { 20 this.path = path; 21 } 22 23 24 25 public String execute() { 26 // TODO Auto-generated method stub 27 String filePath=getPath()+ "\" + getFileName(); 28 try { 29 targetFileName=new FileInputStream(filePath); 30 return SUCCESS; 31 } catch (FileNotFoundException e) { 32 e.printStackTrace(); 33 return ERROR; 34 } 35 36 } 37 38 public InputStream getTargetFileName() { 39 return targetFileName; 40 } 41 42 public void setTargetFileName(InputStream targetFileName) { 43 this.targetFileName = targetFileName; 44 } 45 46 47 48 }
注意:其他例子直接把文件名写在了配置里面,如下:这种太不方便了吧。
<package name="/fileOp" extends="struts-default"> <action name="download" class="com.meetcomet.util.FileDownLoadAction"> <param name="path">/download</param> <param name="fileName">1.png</param> <!-- -不一样的地方 --> <result name="success" type="stream"> <param name="contentType"> image/bmp,image/x-png,image/gif,image/pjpeg </param> <!-- 文件下载的处理方式,包括内联(inline)和附件(attachment)两种方式,而附件方式会弹出文件保存对话框,否则浏览器会尝试直接显示文件。 --> <param name="contentDisposition"> attachment;filename=${fileName} </param> <param name="inputName">targetFileName</param> <!-- 缓冲区大小 --> <param name="bufferSize">2048</param> </result> <result name="error">/fail.jsp</result> </action> </package>