方法一:使用jsp实现:$ P u0 F, ]+ `
- <span style="font-family:FangSong_GB2312;font-size:18px;"><%@ page contentType="text/html;charset=gb2312" %> 5 N2 y G1 R& }4 D
- <%@page import="com.jspsmart.upload.SmartUpload"%> ; V% R9 c( ^5 z& G' i( W
- <%@page import="com.jspsmart.upload.File"%> e4 T4 y# L% q+ n9 i
- <%
! f/ T. v$ g- i2 T' p: K8 i ? - //新建一个SmartUpload对象
) C5 W( G' Y& G7 j& k - SmartUpload su = new SmartUpload(); 2 @/ S; o. }' H: }
- //初始化 ) H. }# T3 K# a/ h" A$ z
- su.initialize(pageContext);
8 M1 H. [, C, \8 u - //设定contentDisposition为null以禁止浏览器自动打开文件,保证单击链接后是下载文件。若不设定,则下载的文件扩展名为doc时,浏览器将自动用word打开它。扩展名为pdf时,浏览器将用acrobat打开。
6 P1 n2 Y* T5 S4 P7 s/ h E - su.setContentDisposition(null);
) W: r$ I- x# U4 c - //下载文件 5 e4 R+ u* C1 x) e% L
- su.downloadFile("WEB-INF/upload/11.rar"); 8 _( e" q% f' ^; B, @5 _: f- ?9 b: m
- //处理输出流问题 7 R5 A% K( _8 y" \
- out.clear(); 5 s9 K( v$ }5 X0 c& {' Q
- out = pageContext.pushBody(); , Q; N8 |/ n% y) ~2 n/ }0 }
- %>
4 {9 y6 T, H1 ?9 v, ~3 B - </span>
复制代码 方法二:使用servlet 实现 :# {+ A. `$ R5 Z1 E4 d- } i
- package downloadFile;
! \) z6 `' f/ {: k( c# h" u - ! C0 M2 M- l! s
- import java.io.BufferedInputStream;
( K- |" v9 l4 K9 P% D! r - import java.io.BufferedOutputStream; % j1 \1 ~/ M& q7 r3 l9 M
- import java.io.File; $ h( V+ x* d3 F3 P0 H2 ?
- import java.io.FileInputStream; Q9 z; z8 [8 V7 O J
- import java.io.IOException; 8 n: ^9 ] `) G8 l
- import javax.servlet.ServletException; ; \+ Z0 c7 @/ V9 X, _
- import javax.servlet.ServletOutputStream;
' {" U5 ?6 ~3 D1 M0 ~ - import javax.servlet.http.HttpServlet; & L8 F0 G: P6 I% F4 U
- import javax.servlet.http.HttpServletRequest; 3 I& ]4 Y3 w" a( d: v$ @
- import javax.servlet.http.HttpServletResponse; # S+ \# K- @5 @) c4 v: w
- " C k3 H: Z1 I! r3 V( i
- ' n( |% B- n( k
- ) H( N( G' R% `8 ~
- public class DownloadFile extends HttpServlet {
y* D) y3 X, y - protected void service(HttpServletRequest req, HttpServletResponse res)
" _) F2 i! I3 o% }; M3 c/ k: _2 F - throws ServletException, IOException { $ N1 D* A3 W* z
-
( Q. ]! ?% l0 |/ l+ ] - // 服务器相对路径 . |9 [4 [% U. O! l# h
- String path = req.getParameter("path"); 0 V' z" }" W) W; e, E) ]
- // 服务器绝对路径 . P3 R; y( ]% l d1 Q4 B# _
- path = getServletContext().getRealPath("/") + path; ! n$ d4 \% d' |' D
- 4 h: c* D) K" J; p$ |( `" t8 @$ e
- // 检查文件是否存在 3 m6 j9 m z" [& T7 u
- File obj = new File(path); 8 o" _/ P' l& M. C& p$ d' ?
- if (!obj.exists()) { 3 ^7 ~- N' X% z/ @) i$ z5 |
- res.setContentType("text/html;charset=GBK"); 2 B* r9 O* t8 ^9 {' a
- res.getWriter().print("指定文件不存在!");
# Y$ l- l/ ?7 @' r* G; W L - return; 5 g, z T% q5 ~* X9 k6 l0 W
- }
% Z2 n( T5 y: t4 ` - / O6 Y7 W+ Y- D' W. P
- // 读取文件名:用于设置客户端保存时指定默认文件名
2 _% h7 C* x# C0 v( u6 K0 s+ o - int index = path.lastIndexOf("\"); // 前提:传入的path字符串以“\”表示目录分隔符
# S- Z% j3 W# l - String fileName = path.substring(index + 1); " _! Q! H% x7 g4 K% h+ y/ k0 ]5 Z! H- _
-
6 c/ @9 u% @7 `! x6 y5 f - // 写流文件到前端浏览器
' Z e$ j3 V9 ?7 R - ServletOutputStream out = res.getOutputStream(); 6 J7 D7 U. S' Z/ D4 `
- res.setHeader("Content-disposition", "attachment;filename=" + fileName);
4 _1 w4 I7 X# c. X# h! v; m - BufferedInputStream bis = null;
" r" Y: K% p- h& K0 Q - BufferedOutputStream bos = null;
6 h" E1 t" X9 W4 V - try {
- c6 z g9 W! v. _& U) Q: f - bis = new BufferedInputStream(new FileInputStream(path)); / j& I4 \! D$ t) |
- bos = new BufferedOutputStream(out);
: t+ `( u M* A/ I2 }$ C - byte[] buff = new byte[2048]; ) `" N+ |4 U6 {
- int bytesRead;
& W7 F" c% \ h' V. l) }! M% ? - while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
: `5 z! e3 u* L: D y - bos.write(buff, 0, bytesRead); & }/ D7 o1 g- |5 ]8 s
- } 8 W$ e; ]- _% Z4 y" m
- } catch (IOException e) {
9 c7 O+ y+ W5 c) P - throw e;
# s0 ^2 Q+ ]( ] - } finally {
' C" Y. t3 I- U - if (bis != null)
: G3 E& R$ G% L$ H f, _; P7 O - bis.close(); , }4 F4 o8 h5 S: m3 u3 W
- if (bos != null) 0 X4 i5 ` @1 X6 J3 q
- bos.close(); - M/ h1 C* t/ t# I! K5 y
- } : H0 ^, B! y% h' _6 p
- } $ \1 u' L2 ~6 e- s
- , w/ k* L% W0 `1 X; o8 j
- }
复制代码 web.xml 设置:
/ y2 A+ r- W+ e' q- <servlet>
4 P# Y# ?1 [. e( u* ` - <servlet-name>DownloadFile</servlet-name> * S7 E- B- x' T
- <servlet-class>downloadFile.DownloadFile</servlet-class>
/ |3 z+ C6 R" E - </servlet> 8 ]6 W k5 E5 \+ Y$ {
- <servlet-mapping> - _+ Q: L f/ C- B
- <servlet-name>DownloadFile</servlet-name> ( k2 J, ^1 [& _" o( m- V: B
- <url-pattern>/DownloadFile</url-pattern>
8 [+ L( m. B) C5 [! c, a J. d - </servlet-mapping> $ }- `, Y+ k/ D$ Q, {
- </web-app>
复制代码
" j1 K9 M, d% l' n" O如果此Servlet命名为downloadFile,请求的URL为:http://localhost:8888/upload/DownloadFile?path=web.txt . v2 I7 W* W# j0 S' l3 Q6 G- D, Z7 r0 A
总结: 第一种方法我使用的jsp文件处理,并且使用第三方控件,简单的几行代码就搞定了,第二种方法是使用java语言写的,而且下载的文件是中文命名的话,还会出现乱码的问题.从此可以看出,站在巨人的肩膀上的重要性.
* H! S- C) D+ c4 a% M
3 a/ H4 |3 B, J( P |