方法一:使用jsp实现:
8 C+ L* g7 A% |- <span style="font-family:FangSong_GB2312;font-size:18px;"><%@ page contentType="text/html;charset=gb2312" %> % w1 |5 R' H7 r& P& z' @1 Q
- <%@page import="com.jspsmart.upload.SmartUpload"%> " M( D* F0 M @3 ^
- <%@page import="com.jspsmart.upload.File"%> - v. b3 j! L0 ?7 Z) d/ S8 ?
- <% g; g5 E4 M0 J2 c4 y# B
- //新建一个SmartUpload对象 * K% q, r9 n9 ~& e* B, O* B+ l
- SmartUpload su = new SmartUpload(); 5 V0 u8 g9 e$ X
- //初始化
3 s0 d) k! a/ b) ]* W - su.initialize(pageContext);
9 |) z" x! N- P1 e, h# t - //设定contentDisposition为null以禁止浏览器自动打开文件,保证单击链接后是下载文件。若不设定,则下载的文件扩展名为doc时,浏览器将自动用word打开它。扩展名为pdf时,浏览器将用acrobat打开。
+ }8 F. v6 }% ?+ O' |3 u - su.setContentDisposition(null); . f2 o* d/ H; i% f' E5 Y
- //下载文件 / h( \* Z- n8 s( M' w4 ?" O+ D8 y# r
- su.downloadFile("WEB-INF/upload/11.rar");
) [+ w: s! M& ], `' `2 ^0 ]" Y' A( B1 \ - //处理输出流问题
& a+ Q5 I# r1 k; K - out.clear(); 1 d" j& e& \+ g/ t4 @/ k9 q8 j
- out = pageContext.pushBody();
7 b' d+ s2 W8 s. F8 O - %> 7 q: w% N! s) @; M' i9 h
- </span>
复制代码 方法二:使用servlet 实现 :5 s3 I# _- [( Q
- package downloadFile; ) D1 H0 q' y, ~: ?( E3 b' n
-
- ?5 J) q# U' S* n1 K; I - import java.io.BufferedInputStream; & Z" f' W ^ x
- import java.io.BufferedOutputStream;
* Y% G/ I; m( r! B - import java.io.File; " T6 n- u" ?1 f( B; |
- import java.io.FileInputStream; & `: z0 N7 a) f% m$ U& e4 i, N
- import java.io.IOException;
" J4 M' w+ U9 F @6 ?, D - import javax.servlet.ServletException;
8 i0 R1 o& K4 h9 O - import javax.servlet.ServletOutputStream; $ K0 K: Y4 V+ c! e6 `/ L
- import javax.servlet.http.HttpServlet; : G( M: l. h: i- J8 P0 Z, y
- import javax.servlet.http.HttpServletRequest; . q$ f. X9 z0 S1 U$ x
- import javax.servlet.http.HttpServletResponse;
, s6 Z1 `% l! b. f -
# j$ u, `8 n, D; D7 N - 0 M; k+ p, ~4 j% ~; O
- 5 K5 [2 B: X4 ?9 p9 n m7 R
- public class DownloadFile extends HttpServlet { 2 |: `4 M0 L+ G- v- y
- protected void service(HttpServletRequest req, HttpServletResponse res)
7 A; X7 _2 |2 q0 S4 j3 i, r - throws ServletException, IOException {
; z O1 F5 q! k& {; v7 k0 X - ' r# H( ]: j: L, \9 P) _6 _
- // 服务器相对路径 / H4 S9 g' Q1 W. {+ @
- String path = req.getParameter("path");
$ z7 J. \3 z: z" V0 @ - // 服务器绝对路径
! Y/ X" h5 y" o& k& o: s. ~ - path = getServletContext().getRealPath("/") + path; 8 m, d! C3 j. Z4 I0 q
-
2 K/ e1 X j6 e: V; C3 l - // 检查文件是否存在
- @1 }5 N, J* c0 f# i# a2 p - File obj = new File(path);
5 Z- @9 e7 L% f - if (!obj.exists()) {
! B1 g$ \3 k4 P - res.setContentType("text/html;charset=GBK"); 3 g( D, ]6 k% e" Q
- res.getWriter().print("指定文件不存在!");
; G! v/ x2 u* Q' p - return; 2 h( j. z& W" b
- } 0 X5 N- ^' ?( {+ l- Z
-
7 e, V {# |1 F0 y1 v- _ - // 读取文件名:用于设置客户端保存时指定默认文件名
9 e' ?1 j, w* H9 k6 i& m - int index = path.lastIndexOf("\"); // 前提:传入的path字符串以“\”表示目录分隔符 ' l; i" q! A: U9 a; i r/ _) a
- String fileName = path.substring(index + 1); ) m( [# ?; n% E) Z' ]" A3 y; A9 a
-
& o3 a% d6 U& `- d2 o - // 写流文件到前端浏览器 & p; `2 U Q$ Z4 w8 M9 ]
- ServletOutputStream out = res.getOutputStream(); 1 {. w/ M" |' z" k: j; L& [
- res.setHeader("Content-disposition", "attachment;filename=" + fileName);
x, V% _5 @/ o* }( F, d - BufferedInputStream bis = null; - p2 c8 |6 F j. t3 i' _( m
- BufferedOutputStream bos = null;
6 W" `; W* M" h% L6 s/ q - try {
, o: C: m* |& Z$ y1 y6 o - bis = new BufferedInputStream(new FileInputStream(path)); : ^ f4 R. _: J6 l7 `& J, h
- bos = new BufferedOutputStream(out); 7 q4 b+ d' `; M6 V# y" @5 Y; U8 t) E w* C
- byte[] buff = new byte[2048]; ( c1 j& ]6 q3 u9 y/ u: }
- int bytesRead; & I: s: g" w# Y$ E3 h! c
- while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) { - A4 J# u* k J' a% i4 B3 v f
- bos.write(buff, 0, bytesRead); # @% D% Q8 d: W- ?; M( q9 C
- }
! q. n# e3 @9 S* w% Z' b5 M - } catch (IOException e) { 2 I. j/ S9 Y. L# I S V
- throw e; - z F, r% q- z9 E: l3 K# A
- } finally { $ Y6 Y! j4 | ?3 Q
- if (bis != null) 0 N5 S8 R5 {0 W) N/ S8 f$ K0 Q
- bis.close();
" t# C. C% b9 R% Z& C1 T& | - if (bos != null)
4 K# N' H1 p: K2 f- x - bos.close();
) v1 V6 t. C# b; a) Q0 u/ X - } ! }4 v W5 k1 Q4 n3 k. n( L
- } & r5 \& W- I" `* Q6 V& z( r
-
# k: \4 |9 ^& I. z) b, j8 x1 M - }
复制代码 web.xml 设置:
3 F C; T1 O8 C6 j0 f8 _! g- <servlet>
5 B& |3 Q1 h, r2 M( L - <servlet-name>DownloadFile</servlet-name> . O) h' [6 C+ a. d6 D5 Z* Z3 g
- <servlet-class>downloadFile.DownloadFile</servlet-class> ! V2 S" i8 S( M- |4 L) p
- </servlet> - @( R0 r8 c% b; E, Q
- <servlet-mapping>
9 A, }9 C5 [( Z- @ - <servlet-name>DownloadFile</servlet-name>
# G; t$ b% P* ]' e2 A - <url-pattern>/DownloadFile</url-pattern> % q0 |# G# e. i; ~
- </servlet-mapping>
/ u9 e4 ?& G8 @ - </web-app>
复制代码
. s+ C$ F3 V& k% E' x$ M' o如果此Servlet命名为downloadFile,请求的URL为:http://localhost:8888/upload/DownloadFile?path=web.txt : X3 V7 Q$ k0 I5 A
总结: 第一种方法我使用的jsp文件处理,并且使用第三方控件,简单的几行代码就搞定了,第二种方法是使用java语言写的,而且下载的文件是中文命名的话,还会出现乱码的问题.从此可以看出,站在巨人的肩膀上的重要性.
5 l# {% e* P; V2 x: @! A, x2 W2 S
. q9 R( C9 C+ `$ u5 H |