1.struts 1
通过struts实现文件下载有两种方式,一种是继承DownloadAction,一种是读取文件流然后output到response里面。
1.继承DownloadAction,需要重写getStreamInfo方法,返回StreamInfo,DownloadAction有两个StreamInfo,FileStreamInfo和ResourceStreamInfo。
例子:
protected StreamInfo getStreamInfo(ActionMapping actionMapping,
ActionForm actionForm, HttpServletRequest servletRequest,
HttpServletResponse servletResponse) throws Exception {
servletResponse.setCharacterEncoding("UTF-8");
String filename = java.net.URLEncoder.encode("filename", "UTF-8");
servletResponse.setHeader("Content-Disposition", "inline; filename="
+ new String(filename.getBytes("UTF-8"), "GBK"));
File file = new File("test.jpg");
StreamInfo si = new FileStreamInfo("image/jpeg"), file);
return si;
}
有关Content-Disposition的介绍可参见我的博客header Content-Disposition参数说明
例子中的编码部分是为了能够显示中文。
2.重写resonse流
public ActionForward download(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
try
{
String path = new String(rootFolder +request.getParameter("path"));
File file = new File(path);
String filename = file.getName();
//取得文件的扩展名ext
String ext = filename.substring(filename.lastIndexOf(".") + 1).toUpperCase();
InputStream fis = new BufferedInputStream(new FileInputStream(path));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
response.reset();
response.addHeader("Content-Disposition", "attachment;filename="+new String(filename.getBytes()));
response.addHeader("Content-Length", ""+file.length()); //设置返回的文件类型
OutputStream toClient = new BufferedOutputStream(response.getOutputStream()); //得到向客户端输出二进制数据的对象
//根据扩展名声称客户端浏览器mime类型
if(ext.equals("DOC"))
response.setContentType("application/msword");
else
response.setContentType("application/octet-stream"); //设置返回的文件类型
toClient.write(buffer); //输出数据
toClient.flush();
toClient.close();
}
catch(IOException ex){
ex.printStackTrace();
}
return null;
}