方法一:使用jsp实现:$ t' {- b" }! s( B& l% o( t
- <span style="font-family:FangSong_GB2312;font-size:18px;"><%@ page contentType="text/html;charset=gb2312" %> * t# ]8 T1 [, t
- <%@page import="com.jspsmart.upload.SmartUpload"%> ) y" e! U- z2 x `3 l* S
- <%@page import="com.jspsmart.upload.File"%>
- O* e8 g+ E' M3 _ - <% 5 i9 z' p, [1 w) }# u. U
- //新建一个SmartUpload对象
, }6 Y1 z: ^" X/ e6 w - SmartUpload su = new SmartUpload(); 0 g( |/ D2 i0 ~* a' p+ `
- //初始化 3 J. H+ U5 V' E4 D! b X+ _
- su.initialize(pageContext);
7 u6 x/ n" X; s% {. U - //设定contentDisposition为null以禁止浏览器自动打开文件,保证单击链接后是下载文件。若不设定,则下载的文件扩展名为doc时,浏览器将自动用word打开它。扩展名为pdf时,浏览器将用acrobat打开。 / R) F" ?3 L {7 R9 z- X' a) @
- su.setContentDisposition(null);
+ ~- p. @' @" ?9 T& u: c* w - //下载文件
' ~0 q! C4 N0 s9 O+ h& n - su.downloadFile("WEB-INF/upload/11.rar");
$ S& q* K& H: L, I - //处理输出流问题
& K+ c, v3 m& f5 |: ^ - out.clear(); - I: w, U3 V: \# U* E, K. E5 @) ^" k
- out = pageContext.pushBody();
9 G( V5 g* G: C8 V4 W - %>
6 F9 h. _; }" K4 d* ], X/ m - </span>
复制代码 方法二:使用servlet 实现 :
0 G; c6 M; ~4 f4 K3 n- package downloadFile; # k, Y' ?$ A- B
- ) F6 y) N- O9 M
- import java.io.BufferedInputStream;
' F& I; V/ L4 M3 T2 V2 k0 E - import java.io.BufferedOutputStream; , } U' J7 l) _3 Y
- import java.io.File; 0 ~% k! s T- w! j
- import java.io.FileInputStream; 5 K0 q! w7 W& s
- import java.io.IOException; % D8 i1 N$ n$ q6 q: U
- import javax.servlet.ServletException; & y9 @, x2 N' w1 l5 e K: M
- import javax.servlet.ServletOutputStream;
" ~; T( {3 D! p3 g9 N( n: B, f; B - import javax.servlet.http.HttpServlet; 7 E& v/ x+ b5 z# r: W2 a8 b8 c
- import javax.servlet.http.HttpServletRequest; # @* T0 }* g1 b2 J' e" ?) i; W6 d
- import javax.servlet.http.HttpServletResponse; ) M8 F; ~- R# H* Y
-
3 p4 ~& z4 H7 R -
5 S: c7 j) J( \% U" e - ; l( s: K: {4 t2 X) i s3 y+ E
- public class DownloadFile extends HttpServlet {
4 k3 ^; Q( J$ P+ m& n: ^; ^: a( @ - protected void service(HttpServletRequest req, HttpServletResponse res)
# d8 i7 I6 ~2 C4 m/ c5 ]& k: c8 ] - throws ServletException, IOException {
$ B$ M# d# c v. u3 t - 3 U: `$ E& s9 B3 d
- // 服务器相对路径 D K9 j0 a! S0 t
- String path = req.getParameter("path"); " y3 _0 b s- R
- // 服务器绝对路径 " l) N- g4 n* A, \/ ]7 U/ z
- path = getServletContext().getRealPath("/") + path; ; j! F# }- V: J
- . G+ h/ o/ I, w$ ?
- // 检查文件是否存在
! @, P) K, W1 _2 S - File obj = new File(path);
& C! F, I0 `+ g( A1 _ - if (!obj.exists()) {
* V- i6 q, b5 P( S5 v5 B5 i - res.setContentType("text/html;charset=GBK"); # z' _" h; V% x/ n
- res.getWriter().print("指定文件不存在!");
5 V l3 E3 ~. X( A; q t4 N/ c - return;
0 d# r6 _6 g8 y* m. G; S: {2 u - }
# w8 M$ }% K5 U% ~2 I( F) p7 F. ? -
# a" A4 \( I+ I" U* O2 ^# C - // 读取文件名:用于设置客户端保存时指定默认文件名 ' P& v8 `! W+ O8 {) n# M1 g( e
- int index = path.lastIndexOf("\"); // 前提:传入的path字符串以“\”表示目录分隔符
: X5 c6 R8 I- u: \9 N- N2 a# j8 ] - String fileName = path.substring(index + 1);
; z- D, A; b6 T: z - , a' G, e* M c) @5 D
- // 写流文件到前端浏览器 2 a$ }: E. K0 I
- ServletOutputStream out = res.getOutputStream(); ; ]9 {5 T: C! _/ a8 S \$ z& b
- res.setHeader("Content-disposition", "attachment;filename=" + fileName);
2 c, r0 q" u$ E" j - BufferedInputStream bis = null; ' v; o5 B# @; y g
- BufferedOutputStream bos = null; ) p2 ]% }: f! \% R
- try { / X+ Y! [8 w( X, b
- bis = new BufferedInputStream(new FileInputStream(path));
2 B7 A4 e3 P; Z$ _# w1 Q - bos = new BufferedOutputStream(out);
2 N) Y" k. _( ?, l7 z8 N0 @ - byte[] buff = new byte[2048];
( d6 t6 ^( d/ {4 e2 t W. _% s - int bytesRead; G. |7 X1 n* M1 E$ p! {
- while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) { P- x3 X5 U1 _" ?! V, e! R
- bos.write(buff, 0, bytesRead); 9 D" X; D! w7 j& Z$ b- T$ e, p
- } + d/ h$ a0 u/ [" m
- } catch (IOException e) { 1 f0 S# E3 w" a2 N0 k' H) \8 d
- throw e;
+ R$ f }8 w4 \3 Z/ n - } finally { 4 q4 H. w' ]3 s- [
- if (bis != null)
% h. D" H/ _8 c - bis.close(); ' _* |+ r5 F. ^$ _. O: @
- if (bos != null) 3 H9 v+ P7 g6 } |8 j* ]5 O8 M2 T( M
- bos.close();
, c1 {3 j, ~" r/ N% }) g& ? - } - i d p1 L0 K, Z0 b# R( e
- } % N4 y% u/ o8 ?
-
; P! R2 e% l! b/ k; g - }
复制代码 web.xml 设置: 6 W7 N. I- ?6 o: n- p- o. n
- <servlet> / s9 j( A% W( y3 C( y8 r
- <servlet-name>DownloadFile</servlet-name> c7 M W# }: p; G) E# m+ H% G
- <servlet-class>downloadFile.DownloadFile</servlet-class>
1 ?$ d. K" R, M - </servlet>
8 n) ], v( X% ^9 t - <servlet-mapping>
/ K& o: p1 t' f1 _+ v - <servlet-name>DownloadFile</servlet-name> * x; R* O1 Z4 q! _) k- ?
- <url-pattern>/DownloadFile</url-pattern> ' D, w- s# M1 m# y% u5 {7 G N
- </servlet-mapping> }: n) _! D- D& | e4 H* \
- </web-app>
复制代码
7 e- ^( a/ G, ]" V. B$ c/ x& o- ^如果此Servlet命名为downloadFile,请求的URL为:http://localhost:8888/upload/DownloadFile?path=web.txt ; d, X5 U! m3 Z) }* K' d5 d
总结: 第一种方法我使用的jsp文件处理,并且使用第三方控件,简单的几行代码就搞定了,第二种方法是使用java语言写的,而且下载的文件是中文命名的话,还会出现乱码的问题.从此可以看出,站在巨人的肩膀上的重要性. 5 t/ p5 P6 H* N5 M3 ]" W, `7 Y6 T1 I! z
6 U( `, `7 w) ~9 D' J. V. h4 E% W
|