方法一:使用jsp实现:
& h$ b- t( Q+ B: V0 B |- <span style="font-family:FangSong_GB2312;font-size:18px;"><%@ page contentType="text/html;charset=gb2312" %>
. {% Z$ D2 J" W4 k - <%@page import="com.jspsmart.upload.SmartUpload"%>
2 y0 m `% M% W' D- j - <%@page import="com.jspsmart.upload.File"%> S. L& e! u( l, _/ a9 k' T+ t
- <% 0 r* \2 B9 ]" S
- //新建一个SmartUpload对象
( ^" ^! S" ~5 y4 D. v# d K - SmartUpload su = new SmartUpload(); & c/ x7 v4 H6 N
- //初始化 3 N& g% D! {- p2 \( ]
- su.initialize(pageContext); ) ?* C8 m' k- ?! o; _* t& m B, Q8 z
- //设定contentDisposition为null以禁止浏览器自动打开文件,保证单击链接后是下载文件。若不设定,则下载的文件扩展名为doc时,浏览器将自动用word打开它。扩展名为pdf时,浏览器将用acrobat打开。
! h: U1 }3 R5 ?- @ - su.setContentDisposition(null);
3 S" u' }5 J6 l1 s0 C6 v - //下载文件 ; y6 I5 h6 `* Y. r' X7 h
- su.downloadFile("WEB-INF/upload/11.rar");
5 d# ^( L: z2 O/ F; L9 c - //处理输出流问题
C6 r9 _6 C9 \* G7 d1 S E5 H - out.clear();
! p0 Y; o/ h; x; K4 z - out = pageContext.pushBody();
1 X/ x2 ]) r1 g( m, _0 n - %>
* M: P& w$ u5 ~) B" i - </span>
复制代码 方法二:使用servlet 实现 :) A2 V! n" G; n5 C
- package downloadFile;
0 T; k$ J' h C9 c' h -
z, b3 l" G0 b - import java.io.BufferedInputStream; P- v" n" T* m7 S j% a
- import java.io.BufferedOutputStream;
( B7 k q4 c- G2 U& n9 s, b6 ~! s - import java.io.File; 1 S8 m" W; {7 ^& d+ O" `* u: z
- import java.io.FileInputStream;
/ q8 V& F3 A+ q& S' l9 n1 X* H6 N - import java.io.IOException;
7 W9 i. T) |2 s: B- I j* h - import javax.servlet.ServletException; 1 L: ^# w |6 ]6 y& |" v( M! c
- import javax.servlet.ServletOutputStream;
, y0 }% c) h: ^6 } - import javax.servlet.http.HttpServlet;
7 o4 s# Q" h* ~0 G x7 I8 t# ?3 } - import javax.servlet.http.HttpServletRequest;
* t3 S5 S3 T' h' o7 H6 C- d - import javax.servlet.http.HttpServletResponse; % ^. R% R' k( D2 v
-
+ r6 u1 C: Y+ C/ S* K" Y: x; b - - C: Q2 p! t8 T
-
! j8 W7 t3 B2 N9 L3 ^ - public class DownloadFile extends HttpServlet {
9 \6 I* m7 V/ s - protected void service(HttpServletRequest req, HttpServletResponse res)
) t6 [) \; k. j7 n" K- W6 B/ @* t - throws ServletException, IOException {
. x7 L1 K+ y: f/ v6 {. w - & s& E& X; F6 x
- // 服务器相对路径
1 H# h/ e- [* o# s. O5 L- b# s2 i - String path = req.getParameter("path"); Y3 K3 o8 U- p
- // 服务器绝对路径
S, Z0 w9 W {0 C V* E - path = getServletContext().getRealPath("/") + path;
: i7 N X8 L& k D' e5 p - - i; V! D! c$ ~( h2 I
- // 检查文件是否存在
( v& o6 T, X% M$ f) a$ x - File obj = new File(path);
: U- j8 w1 _/ m - if (!obj.exists()) { 0 _. ?' f: {1 _) i# L, o1 Z
- res.setContentType("text/html;charset=GBK");
b+ a8 y% w( t. I. ^0 @6 C - res.getWriter().print("指定文件不存在!");
" x7 k# [7 l' p, y; K' { - return;
2 V3 M6 ] j+ V$ B$ h - }
+ E8 H/ O5 \+ E6 g9 V0 F -
6 m% b/ ~ x+ O - // 读取文件名:用于设置客户端保存时指定默认文件名
* P. f% E* @$ }3 \) O - int index = path.lastIndexOf("\"); // 前提:传入的path字符串以“\”表示目录分隔符 ' ]$ ~. O2 m+ F; r
- String fileName = path.substring(index + 1); ( ^6 p) I* F8 m* E: I
-
2 o, X) ?$ w, U - // 写流文件到前端浏览器 2 k) n7 d% d' r6 ]7 Y a
- ServletOutputStream out = res.getOutputStream(); 9 O9 S. i4 P3 \6 X8 d2 _7 l0 p
- res.setHeader("Content-disposition", "attachment;filename=" + fileName); 4 A6 y/ U) W4 c) t" J
- BufferedInputStream bis = null;
7 `9 C0 L, R; X" W# \0 v& F5 z - BufferedOutputStream bos = null;
1 ?2 B; g! l! _$ U- A3 W - try { F# g1 `$ U6 h: Y( J o
- bis = new BufferedInputStream(new FileInputStream(path)); 1 r. K$ Q/ U1 _2 O; {4 f& s" I1 n; J
- bos = new BufferedOutputStream(out);
( U8 \2 t F& o% ^3 W - byte[] buff = new byte[2048];
! u! M4 F3 K+ I9 }) [5 t9 R - int bytesRead;
: t* F( z2 ^: E: c - while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) { ! Q' Z4 y' k: X' X) C$ k" U
- bos.write(buff, 0, bytesRead); ( N8 g8 I' X, q* o L4 {
- }
3 A0 A7 {. W& g - } catch (IOException e) {
6 x0 B$ M" v, f8 q" ~- ]8 p - throw e; : C4 b! U0 X, N- e4 i
- } finally { 4 u! }& w h, F5 j4 y
- if (bis != null) ) H1 Q# R6 l* b9 |
- bis.close();
5 N+ N9 @* O% N% Y( S - if (bos != null) ( b1 Z! [6 \; S5 ^3 }; B$ _5 O
- bos.close(); ) l& ^% S# j* D% ]
- } - I8 T1 V9 @0 G
- }
0 Q8 }0 Z/ o: I7 _8 R7 Z -
" ~. c: o X: s P1 S - }
复制代码 web.xml 设置:
) B2 y- Q2 W" x5 L# K! q7 g3 W- <servlet>
) d" R! g2 r% |* k+ D - <servlet-name>DownloadFile</servlet-name> " S9 m8 o, c0 r4 z
- <servlet-class>downloadFile.DownloadFile</servlet-class>
' I7 h4 F8 E3 i9 x5 A0 L& D& { - </servlet>
3 z( u6 i6 J5 c - <servlet-mapping> $ K5 D4 T: d6 { V$ @
- <servlet-name>DownloadFile</servlet-name>
' }4 B! I/ j( f: A! d2 } - <url-pattern>/DownloadFile</url-pattern>
8 ~# X d+ I0 N# D - </servlet-mapping> 9 _! ?5 R) W$ w1 B% Q0 B$ G! Q
- </web-app>
复制代码
4 |* G: X; G, Q' H3 X如果此Servlet命名为downloadFile,请求的URL为:http://localhost:8888/upload/DownloadFile?path=web.txt 4 W* k, _! U. }4 D
总结: 第一种方法我使用的jsp文件处理,并且使用第三方控件,简单的几行代码就搞定了,第二种方法是使用java语言写的,而且下载的文件是中文命名的话,还会出现乱码的问题.从此可以看出,站在巨人的肩膀上的重要性. ( r2 j! u5 C- r% M
; o1 }% }6 m3 s/ t- ? |