方法一:使用jsp实现:
% X9 X- R. l' d4 e, u- @- <span style="font-family:FangSong_GB2312;font-size:18px;"><%@ page contentType="text/html;charset=gb2312" %> 9 ?( A# T5 Z1 w: z
- <%@page import="com.jspsmart.upload.SmartUpload"%>
2 P/ E4 T0 f7 c. W- k2 A& r. [: ? - <%@page import="com.jspsmart.upload.File"%> $ B7 ~0 z0 q- A
- <% 0 s5 \4 t; q; ]- e3 U6 \- f1 u: T( \5 Z
- //新建一个SmartUpload对象
- H& l* j$ F+ M- C' X( o N - SmartUpload su = new SmartUpload();
9 L' N! j* P- w6 q, `8 {6 [7 t - //初始化 " s" Z" R) S$ }! }" V Q, r
- su.initialize(pageContext); $ v+ P! i, \& C3 k) e* ]
- //设定contentDisposition为null以禁止浏览器自动打开文件,保证单击链接后是下载文件。若不设定,则下载的文件扩展名为doc时,浏览器将自动用word打开它。扩展名为pdf时,浏览器将用acrobat打开。
$ e' |- n( Q$ h2 n+ N, \8 K - su.setContentDisposition(null); 9 q) j- f& r% v7 m$ z( E
- //下载文件 7 z) D* ^* q3 B
- su.downloadFile("WEB-INF/upload/11.rar"); 9 V, ^4 g% m2 P% h
- //处理输出流问题 " v( a% N5 l; Z0 T0 J
- out.clear();
( n$ ~4 r8 x" R* ~ - out = pageContext.pushBody();
. P4 f5 P- [. o0 ~ Z ^* U, {0 F3 W - %>
# T' R7 @" B& B. Z( W8 Q9 x6 V+ M - </span>
复制代码 方法二:使用servlet 实现 :% n% G: \9 X" n% K! y: H8 g- l
- package downloadFile; 5 K B8 a& f r& Q
-
/ M4 R6 J/ |5 y- S - import java.io.BufferedInputStream;
. s' {6 r7 Y/ y" Q# k1 T - import java.io.BufferedOutputStream; / f" D0 l$ J8 r/ \6 m- U: U
- import java.io.File;
2 [8 [$ a9 t9 r9 D5 ] - import java.io.FileInputStream; ! c7 N4 [* `. Y3 e( o
- import java.io.IOException; 3 l- B, ?5 X+ i. u" q3 o
- import javax.servlet.ServletException; 6 Y$ M6 h$ _0 h1 t5 Q$ t+ ]- v
- import javax.servlet.ServletOutputStream; 3 U ~+ |1 o8 j" g5 Q* {
- import javax.servlet.http.HttpServlet;
/ o2 l* Z, U/ h" M! t - import javax.servlet.http.HttpServletRequest; ) z. C. n" ]0 w- i+ H6 b. P
- import javax.servlet.http.HttpServletResponse; # G, r4 i: z" v/ W
-
! D; x! o9 I6 Q; Y, W$ _1 m- A! | -
9 S# y; z& z2 q' n9 @' e - & S0 D: X; ]1 l3 q- g+ E( ~# S
- public class DownloadFile extends HttpServlet { 5 o9 W7 u1 p0 p7 x, G2 C
- protected void service(HttpServletRequest req, HttpServletResponse res) / d d" S) B3 [5 y1 _; S& E
- throws ServletException, IOException { 3 v. V" j6 ?2 K& B
- 1 `$ _. Z$ U: O- s+ o+ @1 d
- // 服务器相对路径 " e8 _3 o5 U' u. u/ A: Q! c8 T' v
- String path = req.getParameter("path"); ( Z5 D8 M% a5 J# b7 U W5 \8 u
- // 服务器绝对路径 ; R7 i, z0 k; Y6 t, D' e; d: ?
- path = getServletContext().getRealPath("/") + path;
' n" R4 N& p( L0 y; J% i: F2 w - 1 D: Y- z% _; V" h! P) @) i
- // 检查文件是否存在 , { C) |" Q* N# o1 S
- File obj = new File(path);
8 b7 R0 D" G5 \3 J/ m0 ^ - if (!obj.exists()) { / K& x4 A/ t* L% H, ]
- res.setContentType("text/html;charset=GBK");
: o* p$ e0 t: C5 Y' { - res.getWriter().print("指定文件不存在!"); 0 ~+ c+ j! k# x
- return;
8 J( Z) S3 p7 A4 n- {4 \. ] - } % X2 w! o9 p! Z* i, N- D
-
( S7 v) I$ u% ] - // 读取文件名:用于设置客户端保存时指定默认文件名
( v5 l! \9 M( r- E# C0 o - int index = path.lastIndexOf("\"); // 前提:传入的path字符串以“\”表示目录分隔符 - x6 z. R4 ^) y a X
- String fileName = path.substring(index + 1); 4 F1 P8 `, y$ k1 d5 \
- 1 P* F! [; j" K3 _6 ]4 C1 s' a' s
- // 写流文件到前端浏览器
4 Z3 u& ^4 T. { - ServletOutputStream out = res.getOutputStream(); + I+ V3 r- d% U4 z8 T
- res.setHeader("Content-disposition", "attachment;filename=" + fileName);
! G w- V! l+ C/ T5 |4 J. f1 h - BufferedInputStream bis = null;
0 J/ }2 e5 k2 a! j' Q - BufferedOutputStream bos = null;
0 g# J; B% Y( f" D. J; k - try { 4 _6 }) v7 s) A; Q
- bis = new BufferedInputStream(new FileInputStream(path)); 6 |1 P& p) ]3 b8 D$ v* T
- bos = new BufferedOutputStream(out);
) m- ?6 d u; O. Y) j+ S. P - byte[] buff = new byte[2048]; " I0 C5 V8 `; k% z. l
- int bytesRead; * `/ B5 N6 y# h; K
- while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
. j( \2 J/ _4 I: X' m - bos.write(buff, 0, bytesRead); + `* W" V. X4 q/ y7 U& N
- } + E* l" f& S. ?2 R2 @2 _" C) A- K
- } catch (IOException e) { ; q9 \2 u, g3 @+ D' }% p7 r' \
- throw e;
( S5 i" a3 {; Y- X - } finally { 9 p. n+ r" A6 F: r' v
- if (bis != null)
6 `- Z& H9 t8 l - bis.close(); 9 g! r7 V4 R% ?( X! c' W4 K" ?4 X. h
- if (bos != null)
; V; y0 c. z7 ^5 k8 }$ B [5 C8 r - bos.close();
! h/ f- J/ n& z! A - } 0 n- \1 o, ]2 s6 b
- } / b9 F5 S3 b1 M: T
-
3 G$ Y* o, ]6 W6 V) k - }
复制代码 web.xml 设置:
+ \2 P9 r9 s/ R2 L6 V: j- <servlet> % j1 s y8 R- Q6 _- q) @' B
- <servlet-name>DownloadFile</servlet-name>
% i# l$ u+ j N - <servlet-class>downloadFile.DownloadFile</servlet-class>
* n$ j. v8 I H5 w3 ` - </servlet> 6 l. e5 y( m* P% m9 T0 l9 h; ^" w
- <servlet-mapping> 1 I" w& i) e/ s, i
- <servlet-name>DownloadFile</servlet-name>
7 O C8 q. [8 e - <url-pattern>/DownloadFile</url-pattern> 5 ~& f1 t1 E. X' G* j- ?, s. ]
- </servlet-mapping>
4 a3 n) [7 N/ N - </web-app>
复制代码
: `, A9 g7 J4 v* }4 c! e ^" g如果此Servlet命名为downloadFile,请求的URL为:http://localhost:8888/upload/DownloadFile?path=web.txt 7 t1 f! ~+ [( ^) X" i6 Q
总结: 第一种方法我使用的jsp文件处理,并且使用第三方控件,简单的几行代码就搞定了,第二种方法是使用java语言写的,而且下载的文件是中文命名的话,还会出现乱码的问题.从此可以看出,站在巨人的肩膀上的重要性. 1 g5 y- ]) {' J0 R0 r: z r( s
/ f3 n% D, V* R9 m/ Z$ w
|