方法一:使用jsp实现:. x8 T3 A1 w9 Y/ x9 k& T! {
- <span style="font-family:FangSong_GB2312;font-size:18px;"><%@ page contentType="text/html;charset=gb2312" %>
$ o) b1 D n5 v! X* ^7 Z8 N7 T4 } - <%@page import="com.jspsmart.upload.SmartUpload"%>
. X1 b; v2 ]( a4 n - <%@page import="com.jspsmart.upload.File"%>
3 Y* m* b4 @/ b# f8 }0 N: s+ _ - <%
/ u Y4 }+ _$ o8 ]7 u) o( D - //新建一个SmartUpload对象 * X' k/ n! M# K1 ~# n
- SmartUpload su = new SmartUpload();
+ s& H1 ~9 }$ z2 q. g/ ]9 h) O/ ] - //初始化
\1 m( Q8 |4 W - su.initialize(pageContext); " s/ m0 ]* m6 j' g2 B+ ^5 _( A
- //设定contentDisposition为null以禁止浏览器自动打开文件,保证单击链接后是下载文件。若不设定,则下载的文件扩展名为doc时,浏览器将自动用word打开它。扩展名为pdf时,浏览器将用acrobat打开。 , V. V$ S( ^; \( P- e
- su.setContentDisposition(null); P- a8 u2 }$ s' p b
- //下载文件 6 f3 u- f0 }! T
- su.downloadFile("WEB-INF/upload/11.rar");
j7 y/ k/ K# D$ B) r - //处理输出流问题 4 H. `" N U6 K
- out.clear(); ; n9 q; v E% r6 z* H$ `) K2 X/ _- Q
- out = pageContext.pushBody(); : X6 H9 A3 t! q4 v5 j1 c
- %> 9 s* k, q1 O) S% J) @' I
- </span>
复制代码 方法二:使用servlet 实现 : k+ B u' `" k4 a& h$ J/ ~/ s
- package downloadFile; ; C# ~7 i0 H1 ~. R1 F, @1 y% B. ^$ N
- " W/ b% t- r3 L0 S* q( ? U
- import java.io.BufferedInputStream;
2 I- B$ @8 ^1 t - import java.io.BufferedOutputStream;
2 ?. w+ i$ D& ~% g - import java.io.File; - Z+ m; r0 G4 A9 f. H
- import java.io.FileInputStream;
8 R/ }3 }; V# G0 ? - import java.io.IOException;
1 L% K9 L" ]- Y" ?: ? - import javax.servlet.ServletException; ' [% q0 l2 P( C
- import javax.servlet.ServletOutputStream;
. X: Z* R% F- ? - import javax.servlet.http.HttpServlet;
" z- R+ W6 |4 _. V6 g) ?9 e - import javax.servlet.http.HttpServletRequest; 8 o: j6 T* U- a/ b9 E# Q
- import javax.servlet.http.HttpServletResponse; 7 H% z% h& C1 r3 m! @3 ~0 D1 \
-
% @" A# t' C7 e# X - , T) `6 l9 w) K( m1 P8 s% J1 j, n9 m
- % z5 k+ F; P1 W
- public class DownloadFile extends HttpServlet {
+ H+ Y) M% N; v+ p9 C3 Y* V - protected void service(HttpServletRequest req, HttpServletResponse res) : s: a6 U" h a. R
- throws ServletException, IOException { ! S! P6 E5 l: M# D5 I3 y4 z5 m0 ~# J
- 3 x9 p6 p& \- U
- // 服务器相对路径
: @; L& ]6 L2 ~- X) X' g. U+ |" W - String path = req.getParameter("path");
" X% R( u4 {4 M$ C/ k - // 服务器绝对路径 ' R( `' P' O8 i
- path = getServletContext().getRealPath("/") + path;
9 d* d' B. K( y! y! ]+ |" O - 0 X3 [8 O( U& m7 h9 d0 D2 C
- // 检查文件是否存在 - C! } ^: e5 z4 O: x; m
- File obj = new File(path); ) j; M& o# u/ E5 r- A) C- I0 D. H
- if (!obj.exists()) {
7 q4 d$ {$ ~3 ]* l% ?; v - res.setContentType("text/html;charset=GBK");
7 G4 x' x) p3 a. L2 G9 \5 I - res.getWriter().print("指定文件不存在!"); : B( t. N/ N6 b& A5 I; v7 d$ A& m
- return; 5 K/ c1 g- c$ T; P( Y# c8 m, P
- }
' ^0 J" O: V: P, P( F6 v. S - 3 r1 a* W+ ]/ a( ]. ~/ e
- // 读取文件名:用于设置客户端保存时指定默认文件名
+ g& H q5 q( W7 E! G - int index = path.lastIndexOf("\"); // 前提:传入的path字符串以“\”表示目录分隔符
' [( Y+ E0 S3 ^ - String fileName = path.substring(index + 1);
' k" h( ~# `4 n/ b8 Q5 s - 8 p4 z9 ~& U( G( N- d; ~9 }
- // 写流文件到前端浏览器
/ U. O3 s- [+ X7 R - ServletOutputStream out = res.getOutputStream(); : } G0 O! h6 J- ]; m" a( j# P
- res.setHeader("Content-disposition", "attachment;filename=" + fileName); 0 W) j2 y& @" M5 N' |) g
- BufferedInputStream bis = null;
$ H( l Z+ K& V3 c+ } - BufferedOutputStream bos = null; 5 o3 ]0 W/ Q& [; {1 t5 @
- try {
0 E& c& s9 A' m! p! V" m - bis = new BufferedInputStream(new FileInputStream(path)); & M- g1 v+ t I
- bos = new BufferedOutputStream(out); $ n. S' _& z* ^# b! D5 s( M$ n
- byte[] buff = new byte[2048];
4 t5 b( A0 d3 H3 g% a) B, b - int bytesRead;
' U: |4 @5 K t% k4 b% |' S$ A - while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) { . O6 _1 d; j# {$ L
- bos.write(buff, 0, bytesRead);
3 Q/ q, j6 ^, ~& ~4 j - } ! W: h/ K8 S# k2 e& h8 k
- } catch (IOException e) { R, S. B' S" w8 B% J3 O% ^! r/ @# ~
- throw e;
7 \ g, \) Z9 g* o4 L- f - } finally {
8 _; [; a) s4 X# {% o+ V - if (bis != null)
7 t! [+ ^/ l% m/ u - bis.close(); . @2 S7 a- j. w6 |( G
- if (bos != null) 6 _5 Q9 G0 j1 `9 |
- bos.close(); & P3 D- ~+ f2 O( T4 f& ?
- } 0 B3 _& Q% }3 ]) I8 U
- } 6 h, T. j. M7 u2 V5 X! L4 R
-
, y' n5 S( ^* _! x- h! C2 M - }
复制代码 web.xml 设置:
- Z/ C- I5 ?, }# T2 H- <servlet>
) @* z) G3 \+ Q+ K8 M3 N - <servlet-name>DownloadFile</servlet-name>
' M% j. ]3 W4 Y; E% v - <servlet-class>downloadFile.DownloadFile</servlet-class>
% L4 @/ w. h8 Q4 i - </servlet>
: Q' z* K9 D7 a* M" s - <servlet-mapping> f! u! {* m- l4 A; i- V( \' D
- <servlet-name>DownloadFile</servlet-name> ( D5 o0 Q& A" Y3 S+ L, ?5 Z
- <url-pattern>/DownloadFile</url-pattern>
' x, }; g, f, @: V) @) Y3 c. z - </servlet-mapping>
2 {1 a8 O5 u2 G - </web-app>
复制代码 2 R! P/ n* ]( `" `2 a
如果此Servlet命名为downloadFile,请求的URL为:http://localhost:8888/upload/DownloadFile?path=web.txt ! V& c8 n( _( Z$ ~. _& a% x) r
总结: 第一种方法我使用的jsp文件处理,并且使用第三方控件,简单的几行代码就搞定了,第二种方法是使用java语言写的,而且下载的文件是中文命名的话,还会出现乱码的问题.从此可以看出,站在巨人的肩膀上的重要性.
: R' B9 S7 w# V- N& {" c
: O" W2 ?: c" ?" Q |