方法一:使用jsp实现:
$ `3 S9 k8 D. m9 `* @0 b- <span style="font-family:FangSong_GB2312;font-size:18px;"><%@ page contentType="text/html;charset=gb2312" %>
5 j' ?- k# \' R; Q - <%@page import="com.jspsmart.upload.SmartUpload"%>
$ }- F% a+ l7 ^9 i% ]9 P: |& Z' Y - <%@page import="com.jspsmart.upload.File"%>
: C1 P$ Y9 S' \, k) j, H5 \ - <%
, |9 ^/ z1 A2 [1 Y3 U8 b9 V - //新建一个SmartUpload对象 9 u0 }- |+ I/ R$ u5 N' r
- SmartUpload su = new SmartUpload();
8 p; x; v |8 k+ V3 D - //初始化
. i1 D* Z* G) d! T* n - su.initialize(pageContext); 5 c$ G! M0 |9 c) Q0 k
- //设定contentDisposition为null以禁止浏览器自动打开文件,保证单击链接后是下载文件。若不设定,则下载的文件扩展名为doc时,浏览器将自动用word打开它。扩展名为pdf时,浏览器将用acrobat打开。
$ h& E2 K' N6 t) I3 _ - su.setContentDisposition(null); 3 l) i6 a) n0 x* v) I5 {0 p) J
- //下载文件
- ~1 Z( @' A, y: V- P T+ y$ v8 c - su.downloadFile("WEB-INF/upload/11.rar"); 8 @- r- N4 d( b$ u a: h
- //处理输出流问题
" H+ B2 Q* `$ O2 e0 w2 w# F - out.clear();
0 Y# k1 y' ^9 \8 L - out = pageContext.pushBody();
* Z( U" [" @' \) u; X* v - %>
! G) J7 x' F" t! u0 H - </span>
复制代码 方法二:使用servlet 实现 :* d: o8 L; t$ u* F
- package downloadFile; ' [; A5 N7 F0 M4 O! V# H
-
|- I) t) \, b. i2 R, w T - import java.io.BufferedInputStream;
) N6 ?8 m4 K; O( x/ ` - import java.io.BufferedOutputStream;
}' a, R4 B' j - import java.io.File; 4 X3 {9 e8 |+ m& o0 C
- import java.io.FileInputStream;
( |/ |" D Q9 B& J3 b. G - import java.io.IOException;
# N4 @( r# q2 j1 p$ s, b, I2 m - import javax.servlet.ServletException; , ?2 S! M! m$ O) C% l# v" ^# q. d% j
- import javax.servlet.ServletOutputStream;
6 V) u) D% n" I6 P* H" b, R - import javax.servlet.http.HttpServlet;
: A. W6 f+ M: \2 {0 f q. @! k - import javax.servlet.http.HttpServletRequest; - z: Z. M8 S- Z: C! T! H
- import javax.servlet.http.HttpServletResponse; 6 z- ]! h5 n6 k, H3 c
-
$ E* U4 V8 O( Q" G - - \! L( [ D5 `+ Q
-
) ]7 X) F. m) [' t - public class DownloadFile extends HttpServlet {
* r7 G8 n1 ^9 P: y& g- q, n6 B - protected void service(HttpServletRequest req, HttpServletResponse res)
% a( {, I7 b* z+ w - throws ServletException, IOException {
+ d3 t1 P! r3 q/ L- r7 J# o$ } -
8 X6 j; Z) ?2 S - // 服务器相对路径 8 C. ?, N3 |$ N* U6 Z2 [
- String path = req.getParameter("path"); 8 y) n b1 k% L4 H1 }
- // 服务器绝对路径 $ c0 n+ i' y5 ~# {% B$ H
- path = getServletContext().getRealPath("/") + path; , L6 E5 z& O& m( `4 ?( ]
-
( I! N! `* X3 U# `* ]1 w - // 检查文件是否存在 ) r8 @% j" \7 \: y' l, b; Q
- File obj = new File(path); ) @. N6 D3 x6 T4 Z( Z, P+ a6 G
- if (!obj.exists()) {
. Z" m+ d' C" b( U6 O1 G$ j - res.setContentType("text/html;charset=GBK");
8 {& f9 [7 m% e* C3 J, K" e - res.getWriter().print("指定文件不存在!"); / N5 D: q6 e! v1 Q
- return; 8 A7 N m" |9 t
- }
* m6 V% M) ^- [, Y - : Y2 o. C3 Z- C; p9 b1 N; O
- // 读取文件名:用于设置客户端保存时指定默认文件名
2 x8 q% s" j, C: ?. [$ G# i - int index = path.lastIndexOf("\"); // 前提:传入的path字符串以“\”表示目录分隔符
1 J9 j" E* d9 U3 G5 w - String fileName = path.substring(index + 1);
% |0 t- i$ ]9 o& ]; @ V, W" M - 0 m, P- a# t: A0 o( B
- // 写流文件到前端浏览器 : \" P- ^3 D( B5 k$ o4 F
- ServletOutputStream out = res.getOutputStream(); 8 K( o R; ]/ i0 s `
- res.setHeader("Content-disposition", "attachment;filename=" + fileName);
& Y# C: s X* M; r' G0 p+ y - BufferedInputStream bis = null; 8 a0 l& F* X; l9 s3 ?. O9 E# b
- BufferedOutputStream bos = null;
3 f' g* D: }1 B. g' {. S: I - try {
y+ t4 t4 M3 q, i- S" X8 O3 b. R' z - bis = new BufferedInputStream(new FileInputStream(path)); * h+ v- t9 ?* t! X4 e5 Y# \3 E
- bos = new BufferedOutputStream(out); 1 z* W7 `3 `+ G) o
- byte[] buff = new byte[2048]; ) V) M2 j1 H. f" p2 h
- int bytesRead;
) I$ W$ E7 [. V2 M3 Q: i2 [3 a - while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
+ p: [. [1 S4 h) `+ e7 p - bos.write(buff, 0, bytesRead); a9 J9 B6 N- Q) T! r
- }
8 t" V3 e& P9 F0 i - } catch (IOException e) {
, G% q; _; w4 [% K# ` - throw e;
, I) N$ H0 v2 `* f - } finally { 0 @! |9 M- W* L6 y" p) f
- if (bis != null)
& W; f/ Y9 S. h* _$ s+ L - bis.close();
) V; D& y' n" Z' i/ H4 r- { - if (bos != null)
2 p/ l) g4 y/ g9 D1 e8 p7 c& \8 O - bos.close();
2 p* ?. I4 E7 ^3 X - } * p }9 U% i9 C# z
- } 1 w; O1 j0 B- l5 q7 L
- / N% |; r; p/ R# |! p0 u
- }
复制代码 web.xml 设置:
, M) j& |2 v* p; M9 {4 A. a- <servlet>
! ]8 o* V* G, E# ?/ t K - <servlet-name>DownloadFile</servlet-name>
" a+ ~/ x2 ^2 q+ c4 S - <servlet-class>downloadFile.DownloadFile</servlet-class> & v- i4 [! U4 K6 Q4 Y6 X. @- D
- </servlet>
. ]6 ~, _: Y& T& Z5 ^+ j, m - <servlet-mapping> : x' P5 W! W: f9 h
- <servlet-name>DownloadFile</servlet-name>
: p g* }+ O9 ]" m. I1 D - <url-pattern>/DownloadFile</url-pattern>
8 k3 L9 @) S5 U0 S2 D5 R - </servlet-mapping>
1 k- z2 \0 G- `. ?$ Z+ D0 v% z+ d - </web-app>
复制代码 7 s/ A3 k9 X! V
如果此Servlet命名为downloadFile,请求的URL为:http://localhost:8888/upload/DownloadFile?path=web.txt ! i, }. Y z) b7 g; ?0 o3 O
总结: 第一种方法我使用的jsp文件处理,并且使用第三方控件,简单的几行代码就搞定了,第二种方法是使用java语言写的,而且下载的文件是中文命名的话,还会出现乱码的问题.从此可以看出,站在巨人的肩膀上的重要性. ) W$ v5 Z3 X, k
& c& N- }6 A1 |/ Q) G |