Struts2文件上传下载(一)
要想将文件从客户端上传到服务器,首先要将form的enctype属性设置为” multipart/form-data”,method属性设置为post。然后在服务端获取上传的二进制流,解析出二进制流中所包含的全部表单域。表单域中包含的信息可能是文本信息,也可能是二进制的字节码,文本和字节码混合在一起。要想将一个文件中包含的二进制信息从一个二进制流中“抠”出来,我们需要编写大量的代码来处理字节,比较麻烦。我们可以使用一些编写好的文件上传框架来替我们完成从二进制流中提取表单域的工作。对于java而言,比较常用的框架有两个:common-FileUpload和COS,不管使用哪个上传框架,它都负责解析出HttpServletRequest请求中的所有域,不管是文件域还是普通的文本域。当框架替我们解析出文件域后,我们就可以使用流将文件内容写入到服务器中了。
这两个框架都能够完成文件上传,他们使用的方式有一些差异,但是它们都能够在struts2中使用。Struts2并没有提供自己的文件上传解析器,它需要借助于cos框架或者common-fileupload框架.这两个框架在使用的时候有差异,struts2对他们进行了封装,消除了这种差异。也就是说,在struts2中不管使用哪种文件上传框架,对于我们的编码没有任何影响。那么在struts2中,struts2如何知道使用的是哪种文件上传框架呢?在struts2中的核心包(struts2-core-2.3.4.jar)中的default.properties文件中我们可以看到如下的内容:
可见,在struts2中默认使用的是jakaarta的common-fileUpload进行文件上传的。如果要用它进行文件上传,就必须下载两个jar包
(commons-fileupload-1.2.2.jar,commons-io-2.0.1.jar)并加入到classpath中。上传文件大小最大不能超过2M(2097152byte=2M),当然这个值我们可以在struts.xml文件中进行修改。要想换成别的文件上传框架,只需将对应的jar包Copy到classpath中,然后修改常量struts.multipart.parser即可
如果使用COS框架可去官方下载,它是oreilly组织下的一个小项目,该项目同样可以实现文件上传。
解压后Lib中有一个cos.jar文件就是我们需要使用的jar文件。
下面使用commons-FileUpload来进行文件上传:
这里我使用的是最新的Struts2.3.4,需要加入的包如图
JSP页面,index.jsp
[html] view plaincopyprint?
1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
2. <%@ taglib uri="/struts-tags" prefix="s"%>
3.
4. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
5. <html>
6. <head>
7. <title>文件上传</title>
8. </head>
9.
10. <body>
11. <s:form action="fileupload" enctype="multipart/form-data" method="post">
12. <s:textfield name="user" label="上传者" />
13. <s:file name="upfile" label="选择文件" />
14. <s:submit value="提交" />
15. </s:form>
16. </body>
17. </html>
编写Action:
[java] view plaincopyprint?
1. package com.jason.web.action;
2.
3. import java.io.BufferedInputStream;
4. import java.io.BufferedOutputStream;
5. import java.io.File;
6. import java.io.FileInputStream;
7. import java.io.FileNotFoundException;
8. import java.io.FileOutputStream;
9. import java.io.IOException;
10. import javax.servlet.ServletContext;
11. import org.apache.struts2.ServletActionContext;
12. import com.opensymphony.xwork2.ActionContext;
13. import com.opensymphony.xwork2.ActionSupport;
14.
15. public class FileUploadAction extends ActionSupport{
16. private static final long serialVersionUID = 2904016238332840263L;
17. private String user; //上传者
18. private File upfile; //上传的文件
19. private String upfileContentType; //文件类型
20. private String upfileFileName; //上传文件的原始名
21. private String savePath; //文件在服务器上的保存路径
22. //省略Getter、Setter方法
23. }
在strtus.xml中为这个action做配置
[html] view plaincopyprint?
1. <struts>
2. <!-- 处理中文问题 ,默认配置就是UTF-8-->
3. <constant name="struts.i18n.encoding" value="UTF-8" />
[html] view plaincopyprint?
1. <package name="com.jason" extends="struts-default">
[html] view plaincopyprint?
1. <action name="fileupload" class="com.jason.web.action.FileUploadAction">
2. <!-- 注入属性savePath,表示文件上传位置 -->
3. <param name="savePath">/uploadFile</param>
4. <result name="disp">/show.jsp</result>
5. </action>
6. </package>
7. </struts>
web.xml需要加入struts2的filter
[html] view plaincopyprint?
1. <filter>
2. <filter-name>struts2</filter-name>
3. <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
4. </filter>
5. <filter-mapping>
6. <filter-name>struts2</filter-name>
7. <url-pattern>/*</url-pattern>
8. </filter-mapping>
Action中的execute方法
[java] view plaincopyprint?
1. @Override
2. public String execute() throws Exception {
3. //获取web应用程序在服务器上的路径需要访问ServletAPI
4. ServletContext sctx=ServletActionContext.getServletContext();
5. //取得web应用在服务器上的物理路径:
6. //如"D:/apache-tomcat-6.0.16/webapps/struts2Demo/fileUpload"
7. String absoluteSavePath=sctx.getRealPath(savePath);
8. File saveDirectory=new File(absoluteSavePath);
9. //如果不存在,则创建
10. if(!saveDirectory.exists()){
11. saveDirectory.mkdir();
12. }
13. //保存的文件名
14. String saveName=this.createSaveFileName();
15. //存储到session中
16. ActionContext.getContext().getSession().put("file",savePath+"/"+saveName );
17. //保存文件
18. saveFile(new File(absoluteSavePath+"/"+saveName));
19. return "disp";
20. }
createSaveFileName方法
[java] view plaincopyprint?
1. /**
2. <span style="white-space:pre"> </span>* 获取改名后的文件名
3. <span style="white-space:pre"> </span>* @return
4. <span style="white-space:pre"> </span>*/
5. <span style="white-space:pre"> </span>private String createSaveFileName(){
6. <span style="white-space:pre"> </span>//获取扩展名
7. <span style="white-space:pre"> </span>String extension=upfileFileName.substring(upfileFileName.indexOf('.'));
8. <span style="white-space:pre"> </span>//以系统时间的毫秒数作为文件名
9. <span style="white-space:pre"> </span>return System.currentTimeMillis()+extension;
10. <span style="white-space:pre"> </span>}
saveFile方法
[java] view plaincopyprint?
1. /**
2. * 保存文件
3. * @param outputFile
4. */
5. private void saveFile(File outputFile){
6. try {
7. FileOutputStream fos=new FileOutputStream(outputFile);
8. BufferedOutputStream bos=new BufferedOutputStream(fos);
9. FileInputStream fis=new FileInputStream(this.upfile);
10. BufferedInputStream bis=new BufferedInputStream(fis);
11. byte[] buffer=new byte[1024];
12. int length=-1;
13. while((length=fis.read(buffer))!=-1){
14. bos.write(buffer,0,length);
15. }
16. bos.close();
17. fos.close();
18. bis.close();
19. fis.close();
20. }catch (FileNotFoundException e) {
21. e.printStackTrace();
22. }catch (IOException e) {
23. e.printStackTrace();
24. }
25. }
show.jsp
[html] view plaincopyprint?
1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
2. <%@ taglib uri="/struts-tags" prefix="s"%>
3.
4. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
5. <html>
6. <head>
7. <title>显示页面</title>
8. <meta http-equiv="pragma" content="no-cache">
9. <meta http-equiv="cache-control" content="no-cache">
10. </head>
11.
12. <body>
13. 上传成功!相关信息如下:<br />
14. 上传者:<s:property value="user"/> <br />
15. 原始文件名:<s:property value="upfileFileName"/> <br />
16. 文件类型:<s:property value="upfileContentType"/> <br />
17. 保存后的文件:<s:property value="#session.file"/><br />
18. <img src="${pageContext.request.contextPath}${sessionScope.file}">
19. </body>
20. </html>
运行
文件过滤,我们可以限制文件的大小和格式
配置struts.xml
[html] view plaincopyprint?
1. <struts>
2. <!-- 开发模式-->
3. <constant name="struts.devMode" value="true"/>
4. <!-- 处理中文问题 ,默认配置就是UTF-8-->
5. <constant name="struts.i18n.encoding" value="UTF-8" />
6. <!-- 处理.do结尾的请求 -->
7. <constant name="struts.action.extension" value="do"/>
8.
9. <package name="com.jason" extends="struts-default">
10. <action name="fileupload" class="com.jason.web.action.FileUploadAction">
11. <!-- 注入属性savePath,表示文件上传位置 -->
12. <param name="savePath">/uploadFile</param>
13. <result name="disp">/show.jsp</result>
14. <interceptor-ref name="fileUpload">
15. <param name="allowedTypes">
16. image/bmp,image/png,image/gif,image/jpeg,image/pjpeg
17. </param>
18. <!--不能超过500K -->
19. <param name="maximumSize">512000</param>
20. </interceptor-ref>
21. <!-- 因为一旦为action配置了拦截器,
22. 就不会使用默认的拦截器了,所以需要配置defaultStack-->
23. <interceptor-ref name="defaultStack" />
24. <!-- 出错之后,返回的地址 -->
25. <result name="input">/index.jsp</result>
26. </action>
27. </package>
28. </struts>
测试:如图
出错信息是默认输出的,如果需要输出自定义的错误消息,只需要在国际化的资源文件中配置即可。
Struts.xml中配置国际化资源文件的名称:
[html] view plaincopyprint?
1. <!-- 配置国际化资源文件-->
2. <constant name="struts.custom.i18n.resources" value="messageResource"/>
messageResource.properties文件:
再测试:
多文件上传,可以使用数组或List集合实现多文件上传。表单中的文件域的name属性应该是一致的,加入name属性的值是“upload”,则Action中的属性应该这样来定义:
[java] view plaincopyprint?
1. File[] upload
2. String[] uploadFileName
3. String[] uploadContentType
4. 或者
5. List<File> upload
6. List<String> uploadFileName
7. List<String> uploadContentType
Struts2文件上传下载(二)(这个不容易懂,还是用servlet实现比较好)
如果用户下载的文件是中文名,或者是在下载前检查用户的权限,就要使用Struts2提供的文件下载。在前台页面上提供一个链接,这个链接指向一个存在于服务器上的文件,并且文件的名字是中文名称,对中文名称进行URL编码。以下是download.jsp文件的内容:
[html] view plaincopyprint?
1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
2. <%@page import="java.net.URLEncoder"%>
3.
4. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
5. <html>
6. <head>
7. <title>文件下载</title>
8. </head>
9. <body>
10. <a href="struts2download.action?fileName=<%=URLEncoder.encode("download中文.doc","UTF-8") %>">下载</a>
11. </body>
12. </html>
Action类:
[java] view plaincopyprint?
1. package com.jason.web.action;
2.
3. import java.io.InputStream;
4. import org.apache.struts2.ServletActionContext;
5. import com.opensymphony.xwork2.ActionSupport;
6.
7. public class DownLoadAction extends ActionSupport{
8. private static final long serialVersionUID = -6103161491484708345L;
9.
10. private String fileName; // 要下载的文件的名称
11. private String downDir;// 下载文件夹由struts在配置文件中注入
12. private String fileEncoding;// 文件名 字符集
13.
14. // 省略Getter、Setter方法
15.
16. public InputStream getDownloadStream() throws Exception {
17. // 对于get方式提交的数据需要我们手工进行转码
18. fileName = new String(fileName.getBytes("iso-8859-1"), fileEncoding);
19. // 取得文件的路径
20. String filePath = downDir + "/" + fileName;
21. // System.out.println(filePath);
22. return ServletActionContext.getServletContext().getResourceAsStream(filePath);
23. }
24.
25. @Override
26. public String execute() throws Exception {
27. return SUCCESS;
28. }
29. }
struts.xml配置文件
[html] view plaincopyprint?
1. <action name="struts2download" class="com.jason.web.action.DownLoadAction">
2. <param name="downDir">/download</param>
3. <param name="fileEncoding">UTF-8</param>
4. <result type="stream">
5. <param name="inputName">downloadStream</param>
6. <!--下载文件的缓冲区大小-->
7. <param name="bufferSize">4096</param>
8. <!--
9. 如果想让用户直接使用浏览器打开,我们可以直接指定正确的类型。
10. 如果不好确定类型,可以使用application/octet-stream,表示二进制流
11. -->
12. <param name="contentType">application/octet-stream;charset=iso-8859-1</param>
13. <param name="contentDisposition">attachment;filename="${fileName}"</param>
14. </result>
15. </action>
运行OK!但是当取消下载时会报错
java.lang.IllegalStateException
异常原因分析: stream对应的类是org.apache.struts2.dispatcher.StreamResult,该类的处理过程如下:1。配置其中result标签下的各个参数2。从服务器中获取输入流,并同时与客户端建立输出流(服务器与客户端链接通过Socket进行连接)3。当点击“保存”或“打开”时,开始传输数据。如果点击“取消”,关闭所有的流。 这里要注意的是,但是实际发现Socket并没有断开!并且流也没有关闭!这一点非常重要! 所以在JSP容器通过Response获取输出流之前,前面的流并没有关闭,所以会造成该异常的报出。
解决办法:
需要下载struts2-sunspoter-stream-1.0.jar,并复制在/WEB-INF/lib下
struts.xml配置修改如下:
[html] view plaincopyprint?
1. <result-types>
2. <result-type name="streamx" class="com.sunspoter.lib.web.struts2.dispatcher.StreamResultX"/>
3. </result-types>
4. <action name="struts2download" class="com.jason.web.action.DownLoadAction">
5. <param name="downDir">/download</param>
6. <param name="fileEncoding">UTF-8</param>
7. <result type="streamx">
8. <param name="inputName">downloadStream</param>
9. <!--下载文件的缓冲区大小-->
10. <param name="bufferSize">4096</param>
11. <!--
12. 如果想让用户直接使用浏览器打开,我们可以直接指定正确的类型。
13. 如果不好确定类型,可以使用application/octet-stream,表示二进制流
14. -->
15. <param name="contentType">application/octet-stream;charset=iso-8859-1</param>
16. <param name="contentDisposition">attachment;filename="${fileName}"</param>
17. </result>
18. </action>
只需添加一个result-type,将原有的result中type改为“streamx”,其他一律不变,在这种情况下,点击“取消”的同时也关闭了流,不会再报出该异常。
再点击取消会出现警告
WARN StreamResult:45 - StreamResultX Warn : socket write error
如果出现该警告说明正确执行,该警告说明,Socket非正常中断,但是流确实已经关闭,自此再也不用看到上面出现的讨厌异常结果。
使用servlet实现文件下载
Jsp内置对象response调用方法getOutputStream()可以获取一个指向客户的输出流,服务器将文件写入这个流,然后可下载此文件。
6.测试
download.jsp显示下载选项,LoadFile.java(Servlet)负责下载文件。
download.jsp
> <title>download page</title> </head> <body> <a href=loadFile>Download:test.zip</a> </body> </html> |
LoadFile.java
package com.zj.sample;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoadFile extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponseresponse)
throws IOException,ServletException {
OutputStream o = response.getOutputStream();
byte b[]= new byte[1024];
// the file to download.
File fileLoad = new File("d:/temp", "test.rar");
// the dialogbox of download file.
response.setHeader("Content-disposition", "attachment;filename="
+ "test.rar");
// set the MIME type.
response.setContentType("application/x-tar");
// get the file length.
long fileLength= fileLoad.length();
String length = String.valueOf(fileLength);
response.setHeader("Content_Length", length);
// download the file.
FileInputStream in = new FileInputStream(fileLoad);
int n= 0;
while ((n= in.read(b)) != -1) {
o.write(b, 0, n);
}
}
public void doPost(HttpServletRequest request, HttpServletResponseresponse) throws IOException, ServletException {
doGet(request, response);
}
}
<servlet> <servlet-name>LoadFileServlet</servlet-name> <servlet-class>com.zj.sample.LoadFile</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoadFileServlet</servlet-name> <url-pattern>/loadFile</url-pattern> </servlet-mapping> |
分类: 网站开发2011-05-2622:58 3039人阅读 评论(20) 收藏 举报
filestringuploadjavascriptservletdownload
由于存储空间,对一般用户而言,就是用来操作存储文件的,所以这两天,特意看了一下windows下用servlet实现文件上传、下载和删除,下面是详细代码说明
上传:
用的是commons-fileupload-1.2.2.jar和commons-io-2.0.1.jar组件,可以去apache官网上去下载,然后放到WebRoot/WEB-INF/lib目录下
upload.html
[xhtml] view plaincopy
1. <html>
2. <head>
3. <meta http-equiv="Content-Type" content="text/html; charset=GBK">
4. <title>File upload</title>
5. </head>
6. <body>
7. <!-- action="fileupload"对应web.xml中<servlet-mapping>中<url-pattern>的设置.-->
8. <!-- 必须是multipart的表单数据,才能完整的传递文件数据 -->
9. <form name="myform" action="fileupload" method="post"
10. enctype="multipart/form-data">
11. File:<br>
12. <input type="file" name="myfile"><br>
13. <br>
14. <input type="submit" name="submit" value="Commit">
15. </form>
16. </body>
17. </html>
web.xml里加上下面几行:
[xhtml] view plaincopy
1. <servlet>
2. <servlet-name>Upload</servlet-name>
3. <servlet-class>am.demo.Upload</servlet-class>
4. </servlet>
5. <servlet-mapping>
6. <servlet-name>Upload</servlet-name>
7. <url-pattern>/fileupload</url-pattern>
8. </servlet-mapping>
src目录下新建文件Upload.java:
[java] view plaincopy
1. package am.demo;
2.
3. import java.io.File;
4. import java.io.IOException;
5. import java.util.Iterator;
6. import java.util.List;
7.
8. import javax.servlet.ServletException;
9. import javax.servlet.http.HttpServlet;
10. import javax.servlet.http.HttpServletRequest;
11. import javax.servlet.http.HttpServletResponse;
12.
13. import org.apache.commons.fileupload.FileItem;
14. import org.apache.commons.fileupload.disk.DiskFileItemFactory;
15. import org.apache.commons.fileupload.servlet.ServletFileUpload;
16.
17. @SuppressWarnings("serial")
18. public class Upload extends HttpServlet {
19. private String uploadPath = "d://temp"; // 上传文件的目录
20.
21. @SuppressWarnings("unchecked")
22. public void doPost(HttpServletRequest request, HttpServletResponse response)
23. throws IOException, ServletException {
24. try {
25. // Create a factory for disk-based file items
26. DiskFileItemFactory factory = new DiskFileItemFactory();
27.
28.
29. // Create a new file upload handler
30. ServletFileUpload upload = new ServletFileUpload(factory);
31.
32.
33. List<FileItem> items = upload.parseRequest(request);// 得到所有的文件
34. Iterator<FileItem> i = items.iterator();
35. while (i.hasNext()) {
36. FileItem fi = (FileItem) i.next();
37. String fileName = fi.getName();
38. if (fileName != null) {
39. File fullFile = new File(fi.getName());
40. File savedFile = new File(uploadPath, fullFile.getName());
41. fi.write(savedFile);
42. }
43. }
44.
45. response.setContentType("text/html;charset=GBK");
46. response.getWriter().print(
47. "<mce:script language='javascript'><!--
48. alert('上传成功');window.location.href='index.jsp';
49. // --></mce:script>");
50. } catch (Exception e) {
51. // 可以跳转出错页面
52. e.printStackTrace();
53. }
54. }
55.
56. public void init() throws ServletException {
57. File uploadFile = new File(uploadPath);
58. if (!uploadFile.exists()) {
59. uploadFile.mkdirs();
60. }
61. }
62. }
再看下载Downlaod.java:
[java] view plaincopy
1. package am.demo;
2.
3. import java.io.File;
4. import java.io.FileInputStream;
5. import java.io.IOException;
6. import java.io.OutputStream;
7.
8. import javax.servlet.ServletException;
9. import javax.servlet.http.HttpServlet;
10. import javax.servlet.http.HttpServletRequest;
11. import javax.servlet.http.HttpServletResponse;
12.
13. @SuppressWarnings("serial")
14. public class Download extends HttpServlet {
15. public void doGet(HttpServletRequest request, HttpServletResponse response)
16. throws IOException, ServletException {
17.
18.
19. String aFileName = new String(request.getParameter("name").getBytes(
20. "iso8859-1"), "gbk");
21.
22. File fileLoad = new File("d:/temp", aFileName);
23.
24. FileInputStream in = null; // 输入流
25. OutputStream out = response.getOutputStream();
26. byte b[] = new byte[1024];
27.
28. try {
29.
30. response.setContentType("application/x-msdownload;");
31.
32. response.setHeader("Content-disposition", "attachment; filename="
33. + new String(aFileName.getBytes("GBK"), "ISO-8859-1"));
34.
35. // download the file.
36. in = new FileInputStream(fileLoad);
37. int n = 0;
38. while ((n = in.read(b)) != -1) {
39. out.write(b, 0, n);
40. }
41.
42. } catch (Throwable e) {
43. e.printStackTrace();
44. } finally {
45. try {
46. in.close();
47. out.close();
48. } catch (Throwable e) {
49. e.printStackTrace();
50. }
51. }
52. }
53.
54. public void doPost(HttpServletRequest request, HttpServletResponse response)
55. throws IOException, ServletException {
56. doGet(request, response);
57. }
58.
59. }
删除Delete.java:
[java] view plaincopy
1. package am.demo;
2.
3. import java.io.File;
4. import java.io.FileNotFoundException;
5. import java.io.IOException;
6.
7. import javax.servlet.ServletException;
8. import javax.servlet.http.HttpServlet;
9. import javax.servlet.http.HttpServletRequest;
10. import javax.servlet.http.HttpServletResponse;
11.
12. @SuppressWarnings("serial")
13. public class Delete extends HttpServlet {
14.
15. public void doGet(HttpServletRequest request, HttpServletResponse response)
16. throws FileNotFoundException, IOException {
17.
18. String aFileName = new String(request.getParameter("name").getBytes(
19. "iso8859-1"), "gbk");
20.
21. File file = new File("d:/temp", aFileName);
22.
23. response.setContentType("text/html;charset=GBK");
24.
25. if (!file.isDirectory()) {
26. file.delete();
27. response.getWriter().print(
28. "<mce:script language='javascript'><!--
29. alert('删除成功');window.location.href='index.jsp';
30. // --></mce:script>");
31. } else {
32.
33. }
34.
35. }
36.
37. public void doPost(HttpServletRequest request, HttpServletResponse response)
38. throws IOException, ServletException {
39. doGet(request, response);
40. }
41. }
因为ubuntu server是黑屏,本人用的是ubuntu server10.04,不方便用浏览器来查看文件,因为没有图形界面,也不方便调试,所以可以先在windows上测试通过,然后把相应文件拷到ubuntuserver中的tomcat相应目录下,可以通过samba来传文件,但遇到一个问题,就是中文乱码的问题,因为在开始安装时,选的是英文,后面用网上的一些办法,还是没有解决中文乱码的问题,有知道的大侠,还烦请转告
Servlet实现文件下载源代码
一、如何使用
如果此Servlet命名为download,请求的URL为:/download?path=xxx,请求后出现下载窗口:
二、源码
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FileDownload extends HttpServlet {
protected void service(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
// 服务器相对路径
String path = req.getParameter( " path " );
// 服务器绝对路径
path = getServletContext().getRealPath( " / " ) + path;
// 检查文件是否存在
File obj = new File(path);
if ( ! obj.exists()) {
res.setContentType( " text/html;charset=GBK " );
res.getWriter().print( " 指定文件不存在! " );
return ;
}
// 读取文件名:用于设置客户端保存时指定默认文件名
int index = path.lastIndexOf( " \\ " ); // 前提:传入的path字符串以“\”表示目录分隔符
String fileName = path.substring(index + 1 );
// 写流文件到前端浏览器
ServletOutputStream out = res.getOutputStream();
res.setHeader( " Content-disposition " , " attachment;filename= " + fileName);
BufferedInputStream bis = null ;
BufferedOutputStream bos = null ;
try {
bis = new BufferedInputStream( new FileInputStream(path));
bos = new BufferedOutputStream(out);
byte [] buff = new byte [ 2048 ];
int bytesRead;
while ( - 1 != (bytesRead = bis.read(buff, 0 , buff.length))) {
bos.write(buff, 0 , bytesRead);
}
} catch (IOException e) {
throw e;
} finally {
if (bis != null )
bis.close();
if (bos != null )
bos.close();
}
}
}
三、web.xml配置
< servlet >
< servlet-name > FileDownload </ servlet-name >
< servlet-class > com.fastunit.test.FileDownload </ servlet-class >
</ servlet >
< servlet-mapping >
< servlet-name > FileDownload </ servlet-name >
< url-pattern > /download </ url-pattern >
</ servlet-mapping >