方法一:使用jsp实现:! j. j) \7 `$ v: B
- <span style="font-family:FangSong_GB2312;font-size:18px;"><%@ page contentType="text/html;charset=gb2312" %> 5 K9 t* c x2 d: A3 W9 w3 L
- <%@page import="com.jspsmart.upload.SmartUpload"%> 8 ^' D) O, l) `. M+ }
- <%@page import="com.jspsmart.upload.File"%> r8 z0 D3 t8 O4 f7 {8 g/ O3 f
- <%
4 ]& ^" t! D! t( u/ T- } - //新建一个SmartUpload对象
2 o9 S4 T. \% j$ Q - SmartUpload su = new SmartUpload(); # @& F- F3 g, t" U2 P3 s
- //初始化 6 k, v0 I& v: A6 u# j# a3 w
- su.initialize(pageContext);
0 n! x( o8 I! g: n - //设定contentDisposition为null以禁止浏览器自动打开文件,保证单击链接后是下载文件。若不设定,则下载的文件扩展名为doc时,浏览器将自动用word打开它。扩展名为pdf时,浏览器将用acrobat打开。 # ^9 V- m$ Z. h. k* }
- su.setContentDisposition(null);
5 E! }/ V0 O" ~) W; X4 W - //下载文件 $ b) Z3 C( `, @
- su.downloadFile("WEB-INF/upload/11.rar"); 3 S* V1 h( z; j8 Q l
- //处理输出流问题 1 n. r( f4 m* o/ k! b* C, l
- out.clear(); , }3 W7 U# r+ k- G( u; D f5 a4 h
- out = pageContext.pushBody(); ! H' O) Y% E6 \- V
- %>
2 K0 f4 D+ e T/ s% K. `/ } - </span>
复制代码 方法二:使用servlet 实现 :' a o6 @3 t2 ? t
- package downloadFile; 1 p7 l" b& Y Y: p
-
2 c: s O3 G* [5 e+ z- A# h" D4 z# @- F - import java.io.BufferedInputStream;
$ X. Y$ [$ I) J3 v" C5 | - import java.io.BufferedOutputStream; E1 \% `( \% _
- import java.io.File;
; F3 g7 ^4 j# f2 [! W* x - import java.io.FileInputStream; 6 H. B( B; n; g, L) ^
- import java.io.IOException;
+ z `9 Q0 A" w6 X# Q4 z" N X - import javax.servlet.ServletException;
0 v& B, V# a |5 M, E/ g5 x8 Q7 J - import javax.servlet.ServletOutputStream;
' t( _: |/ p3 `& P+ z - import javax.servlet.http.HttpServlet;
+ `9 Y5 k4 ~) p$ z \ - import javax.servlet.http.HttpServletRequest; 3 G; J9 Y- f' c" R. j
- import javax.servlet.http.HttpServletResponse; 5 z/ z1 ]5 V' x& m2 o2 W: V
-
" E* V) o E/ Y& y' T! k - 1 k0 H; E9 W* i
- : q( N; c3 @; T& c9 Y
- public class DownloadFile extends HttpServlet {
6 y, [6 I+ d# V4 }5 t; [ - protected void service(HttpServletRequest req, HttpServletResponse res)
. V# Y8 N* Y0 o# a - throws ServletException, IOException { " t9 S/ h6 u% C* A% B' W: c
- 2 G' I* I; K. D5 J q1 _3 h
- // 服务器相对路径
$ ]' i& J' e; L, |, ^& B/ V8 Y! e* n - String path = req.getParameter("path");
) X) {4 m" W. R, \. x+ |8 Z% w - // 服务器绝对路径 8 Y$ v- z$ w+ k9 Y% N6 g% |
- path = getServletContext().getRealPath("/") + path;
5 e) E# K6 \6 O2 ?6 L% D' V - 9 d5 Z: p8 t* }3 P/ \% O
- // 检查文件是否存在
' o4 t5 }6 I0 s/ w8 t: A9 g& R7 C1 A5 w - File obj = new File(path); 9 d1 E8 l0 o P
- if (!obj.exists()) {
+ X4 V# y8 S6 g ^) J6 `5 r - res.setContentType("text/html;charset=GBK");
) G/ @5 `5 J- [ X1 I- ]: w - res.getWriter().print("指定文件不存在!");
3 O! C: R6 b6 C8 ?1 V: M - return;
" W; o* @' P3 t$ ~7 ?$ D! o - }
, ?5 |! C; A/ V8 J' p* t$ g7 x+ Q( X8 Z -
5 P5 r! { d+ u - // 读取文件名:用于设置客户端保存时指定默认文件名
6 q# E( @' U4 X4 h; K - int index = path.lastIndexOf("\"); // 前提:传入的path字符串以“\”表示目录分隔符 ! J- s \- @- T# b9 E
- String fileName = path.substring(index + 1);
' o; Z/ o; E: e4 }. ~ - % c6 D# L9 K. {- M0 x/ q1 h2 N
- // 写流文件到前端浏览器
* i7 u7 Y6 u$ S - ServletOutputStream out = res.getOutputStream(); 8 l1 v$ v X/ c2 b) c8 B1 V
- res.setHeader("Content-disposition", "attachment;filename=" + fileName);
& R( k4 D# m! M1 @# F! j, b4 u - BufferedInputStream bis = null; ) p7 p& s7 x. |, z. ]
- BufferedOutputStream bos = null;
! [. A2 m. S @9 }! Z5 }! l4 K - try {
4 _. d/ d6 ^3 U. z - bis = new BufferedInputStream(new FileInputStream(path));
. Y- F, ^8 U$ z2 r1 z. c6 A1 [ - bos = new BufferedOutputStream(out); : y+ u& x# m, |! c; b
- byte[] buff = new byte[2048];
0 A/ K- x( ?1 a2 p - int bytesRead; $ c. \, g. }0 K' {/ v* b& B
- while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) { $ H9 ^6 l8 y. i8 k, O" _) q# g
- bos.write(buff, 0, bytesRead);
7 p4 z/ B& q7 [/ B2 x& I. q - } 7 x8 ~9 K& i2 F$ p
- } catch (IOException e) {
/ E" q; M6 o# e% c6 b9 F' b1 b9 ^ W1 V - throw e; 2 e/ A6 r3 q! i
- } finally {
' P/ o( W( l6 Z$ T8 [4 d3 @% ^5 Y - if (bis != null) " U' J! k8 t7 z3 s4 O
- bis.close(); : f8 t; m1 e: a' G
- if (bos != null)
# _. T6 p8 L/ H; _" Z - bos.close();
0 Z9 y M Q6 x5 e2 |# {8 y - } 0 q8 e0 h* f3 L. x' H
- } , D# ]. |* ~; I4 M. d. O- q
- 6 E* f% W2 N/ z* Z' A
- }
复制代码 web.xml 设置:
5 D1 V$ [& o- e! @" I5 \4 f G- <servlet> # I+ W1 [5 r2 ^& S2 q; f! s7 t$ p
- <servlet-name>DownloadFile</servlet-name>
s1 h( {- n# \# Z - <servlet-class>downloadFile.DownloadFile</servlet-class>
6 z9 {$ c7 M6 ]6 X4 W( T8 V - </servlet>
0 p7 N& `* k5 R5 O - <servlet-mapping>
` B1 N+ A0 p9 A" i - <servlet-name>DownloadFile</servlet-name> 5 R" f- F: u9 R$ p8 P. C
- <url-pattern>/DownloadFile</url-pattern> 4 o0 p- x4 r& U M) R2 @% P2 {
- </servlet-mapping> & \1 z) d. x) l/ r
- </web-app>
复制代码 - T/ O: h% O7 L0 ~& _
如果此Servlet命名为downloadFile,请求的URL为:http://localhost:8888/upload/DownloadFile?path=web.txt & _3 R& X0 R+ n1 S
总结: 第一种方法我使用的jsp文件处理,并且使用第三方控件,简单的几行代码就搞定了,第二种方法是使用java语言写的,而且下载的文件是中文命名的话,还会出现乱码的问题.从此可以看出,站在巨人的肩膀上的重要性.
; \5 N6 [1 {* D( m$ W, a2 g% x6 {- P
|