方法一:使用jsp实现:
! }7 Q8 R. e* Y% z- <span style="font-family:FangSong_GB2312;font-size:18px;"><%@ page contentType="text/html;charset=gb2312" %>
& I! G) q) l/ i! p& Y8 x# U - <%@page import="com.jspsmart.upload.SmartUpload"%>
; V4 g" Z$ }6 w+ s+ `4 v& m - <%@page import="com.jspsmart.upload.File"%> " q3 I. x8 @3 f. w" W6 i
- <%
- o+ I( Z% f4 b, x3 b% p - //新建一个SmartUpload对象 ) [) r6 n: J; C5 j
- SmartUpload su = new SmartUpload();
% s( Q$ ]7 X1 U0 Y - //初始化 0 H9 J( C+ @3 J. ~
- su.initialize(pageContext);
9 A# A: ?, T7 s - //设定contentDisposition为null以禁止浏览器自动打开文件,保证单击链接后是下载文件。若不设定,则下载的文件扩展名为doc时,浏览器将自动用word打开它。扩展名为pdf时,浏览器将用acrobat打开。 ! O1 v; _: N& C2 o* a) [" }2 P
- su.setContentDisposition(null);
/ K' x- |" @$ a# D: P - //下载文件 9 X3 ]; y+ ^0 o) i8 U" r7 n; t
- su.downloadFile("WEB-INF/upload/11.rar");
' Q: ?( h* H# _7 y5 _: L4 \6 l - //处理输出流问题
: @& y0 g" C, e5 c3 b @ - out.clear();
9 M0 }$ L* N* B$ v j' @! b) U - out = pageContext.pushBody(); . i" h$ Z. [: s6 d% c) e8 o
- %>
1 @* Q- x8 \# p) |! Z - </span>
复制代码 方法二:使用servlet 实现 :' S4 n1 ^/ c( ~* o! k
- package downloadFile; ( q8 b3 U+ f9 q4 k6 N" v! o6 v; B
-
}! |5 d2 {- q- q# \ - import java.io.BufferedInputStream;
7 X0 y* |& |0 l8 f - import java.io.BufferedOutputStream;
, O' N: ^* t: k, M4 m$ o8 P* x" U - import java.io.File; + p) F, W$ T. D* U, K% y) b
- import java.io.FileInputStream;
1 d* N( b. C, h0 {& b - import java.io.IOException; & [& `! y6 H3 e
- import javax.servlet.ServletException; 9 y- I6 B5 @/ J/ `
- import javax.servlet.ServletOutputStream; ) [2 v2 q# y% Q( X; l$ d
- import javax.servlet.http.HttpServlet; 1 `7 j4 [7 e5 Q3 s. Z
- import javax.servlet.http.HttpServletRequest;
, B, a" r( c% @% u2 O, U8 }/ g8 R" L - import javax.servlet.http.HttpServletResponse;
. R' ^& Y4 K: w0 |, ]( O -
# n; D6 D% V& E; U -
/ Y* }1 O4 ?6 R, r+ E -
) j! n- o* Z, i% D1 u7 L - public class DownloadFile extends HttpServlet { ( [4 O1 Y9 M4 A* ]: I
- protected void service(HttpServletRequest req, HttpServletResponse res) ; l i6 u4 o/ Z: V
- throws ServletException, IOException { 8 c' r3 [2 q3 ~' j9 l
-
/ f- |+ |0 v2 M# A+ ` - // 服务器相对路径 % V9 j2 c' x+ L4 q
- String path = req.getParameter("path");
& Y W n; ^' l! U8 M9 Y - // 服务器绝对路径 ' Y7 R' B" S2 k' n
- path = getServletContext().getRealPath("/") + path; 8 u- m* M9 K- ^) g. S: y2 y
-
1 H, R2 V4 ?) x5 j8 n - // 检查文件是否存在
" h' h3 B6 J, Z3 j- k( t - File obj = new File(path);
: P+ T+ q! a. _' P2 `0 _ - if (!obj.exists()) {
2 G) M u/ h1 u x - res.setContentType("text/html;charset=GBK");
2 n" q! p9 R, S- p: r; g6 Y: B! O - res.getWriter().print("指定文件不存在!");
" S: H j# ^/ }! l7 @ - return;
+ m4 e1 J, ?* k( H - }
( Z) x1 F5 f2 P+ e2 Y! Q -
: E, E) M% V8 Y9 g - // 读取文件名:用于设置客户端保存时指定默认文件名
( I- `. s x i1 A - int index = path.lastIndexOf("\"); // 前提:传入的path字符串以“\”表示目录分隔符 # ?2 X# ]+ N# Z, Z1 h1 n# F
- String fileName = path.substring(index + 1);
. e3 @# p$ }1 a7 _ - 5 f C* O: q; h2 L7 v1 ?* i! {+ j
- // 写流文件到前端浏览器
. r4 M* X/ K4 U [ - ServletOutputStream out = res.getOutputStream(); " ?9 B5 d; n0 B# b7 b, }
- res.setHeader("Content-disposition", "attachment;filename=" + fileName);
9 U6 `. P+ W1 Q1 V4 ]& O* t9 n - BufferedInputStream bis = null; 8 A7 m3 ], m' x% `- H4 s6 A
- BufferedOutputStream bos = null; 3 Y3 D8 {! B% X1 j9 S
- try { * Q# X( |6 n- G
- bis = new BufferedInputStream(new FileInputStream(path));
# n8 I4 N2 U5 P/ o6 F5 U% F - bos = new BufferedOutputStream(out); 1 K& ?- G! Z2 y' Y* N. I# b! `
- byte[] buff = new byte[2048];
& u: k* {) E2 T2 e! R& o5 ? - int bytesRead;
3 R, \% i" Q$ U6 Y - while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
- ` ]; p! {" r, C& D8 T - bos.write(buff, 0, bytesRead);
) t8 p4 h6 h8 [ - }
) Z6 p b% i# Y c - } catch (IOException e) {
& n' ]0 R, q! ~/ C' r/ C - throw e; ; _5 K1 l9 r7 y/ P
- } finally { 4 p9 d8 S/ Z* e9 H9 }" t& T
- if (bis != null) ; I8 T G+ Q' h+ h1 d3 o3 ]
- bis.close(); , ] [) v$ v4 F. Z9 j, Q
- if (bos != null)
( K0 H& B' x+ c: Z2 d - bos.close(); 8 P( t' O) m8 u5 }8 l
- } ! g! B+ u# x" Y6 R0 a& F$ g, h! w4 X
- }
; B. d4 s( q, _. e -
|. @9 I! T" ~% i - }
复制代码 web.xml 设置:
3 s( B& }2 c6 {5 W# p+ \) l: U- v( C- <servlet>
: ~1 V( N- r/ U; E4 n1 F8 b% a( q7 [ - <servlet-name>DownloadFile</servlet-name>
4 @) q6 u" m; ]% r - <servlet-class>downloadFile.DownloadFile</servlet-class>
) p! ~( O; @3 k I) A+ J - </servlet> 5 s2 n/ U( c1 W
- <servlet-mapping>
: P' o W/ _# k$ D( B - <servlet-name>DownloadFile</servlet-name> 4 k r8 b. S0 v9 Y! f0 ~
- <url-pattern>/DownloadFile</url-pattern> 7 l; W+ q* R8 s
- </servlet-mapping> # C* \8 P2 ^' R {2 X) } c
- </web-app>
复制代码 ) Q; S# H' ^; N6 i/ j4 z
如果此Servlet命名为downloadFile,请求的URL为:http://localhost:8888/upload/DownloadFile?path=web.txt
; y3 T/ M( ~+ s5 Q, }2 x/ ]0 `总结: 第一种方法我使用的jsp文件处理,并且使用第三方控件,简单的几行代码就搞定了,第二种方法是使用java语言写的,而且下载的文件是中文命名的话,还会出现乱码的问题.从此可以看出,站在巨人的肩膀上的重要性.
4 U. I, V8 M3 X/ c8 L1 i! C" D& ?5 S" I) ^ `* W u" o: D
|