方法一:使用jsp实现:" L1 |, m% w0 q t: r! Z4 y
- <span style="font-family:FangSong_GB2312;font-size:18px;"><%@ page contentType="text/html;charset=gb2312" %> 8 h O. t. S% E) c7 R& H
- <%@page import="com.jspsmart.upload.SmartUpload"%> ) n$ t: i' E1 c
- <%@page import="com.jspsmart.upload.File"%> , } m1 U. g( R* O% D) O
- <%
/ e( b" g1 X* i - //新建一个SmartUpload对象
- s6 a( B* I8 M$ t - SmartUpload su = new SmartUpload();
+ @" o& \' [/ E' c& a - //初始化
$ y4 \4 t* q# K& s4 S - su.initialize(pageContext); - O* u$ W2 X9 H/ q" B1 L, t
- //设定contentDisposition为null以禁止浏览器自动打开文件,保证单击链接后是下载文件。若不设定,则下载的文件扩展名为doc时,浏览器将自动用word打开它。扩展名为pdf时,浏览器将用acrobat打开。 6 B: {% g- @) A# i! a
- su.setContentDisposition(null); , c1 ~3 e8 f# ?1 ^1 E& B; B; r( i
- //下载文件 2 z- I8 C+ e# c) e: m
- su.downloadFile("WEB-INF/upload/11.rar");
' r+ o! H: c" r) T, L - //处理输出流问题 - C9 I5 b5 w0 X
- out.clear(); ( E0 L, l v5 ~$ u
- out = pageContext.pushBody(); 2 L O& s1 k3 n: h/ _2 r' @, {
- %> / i) |" f9 j* T. x9 J
- </span>
复制代码 方法二:使用servlet 实现 :& w. ]0 o; C9 P$ }7 m; R9 Y$ F
- package downloadFile; + T- A o+ k- i: f$ `7 h0 F U
-
# a b5 I0 K, W; W* q - import java.io.BufferedInputStream; ! T2 ?6 E e& n- u* d# p1 |
- import java.io.BufferedOutputStream;
+ V( o1 w1 p, H& w - import java.io.File; , @8 V6 s' g, V% t6 T' o B4 w
- import java.io.FileInputStream;
7 Y" T% m. a0 M7 ~% `, s - import java.io.IOException; ' q. S) @4 [5 H9 i
- import javax.servlet.ServletException; " h+ R) {3 L/ J/ Z+ w7 r+ r! F- H
- import javax.servlet.ServletOutputStream; 8 y2 j" Z& e) u$ u
- import javax.servlet.http.HttpServlet; : s& ~4 b3 ` P8 o3 y0 _* j
- import javax.servlet.http.HttpServletRequest;
+ X5 [7 H! L8 {. o, l - import javax.servlet.http.HttpServletResponse; 5 B4 T7 C, L; U5 B3 k0 Y. Q! c
-
9 w$ d( {) E( H4 ^5 n; }5 I; `0 W - , V4 e- I5 R+ d/ p" P w
-
- p/ j! i+ O! I- _/ A$ t - public class DownloadFile extends HttpServlet { - R9 K+ q0 _6 F4 Q" h
- protected void service(HttpServletRequest req, HttpServletResponse res) : E4 C- J ]% x; E9 l+ }' L
- throws ServletException, IOException {
( q' r& F/ q( g. a3 N: e -
2 x- w; } g+ J; `' `* b+ Q- H - // 服务器相对路径
$ o) u* C0 U& A( e# q' W$ D: v - String path = req.getParameter("path"); 0 ]; J: r- r& v
- // 服务器绝对路径 # |! [6 Q, f; v9 Y
- path = getServletContext().getRealPath("/") + path; " l9 ^. T, S+ V7 W, ?
-
9 O6 `' _, c O# O. y0 W2 d - // 检查文件是否存在 + b1 A! R" ]6 i0 \/ o
- File obj = new File(path); ) Z/ Z" m# a5 S+ k$ Q- H' _8 ~
- if (!obj.exists()) { 1 x. V1 I& C1 a- c" f# Y
- res.setContentType("text/html;charset=GBK"); ?- b- F7 Z3 N$ {
- res.getWriter().print("指定文件不存在!");
4 @, t; K8 Y) k3 v+ W - return; 6 J: L, b; H, g: s! R! h' F, R" B
- }
5 T) ]7 ~7 Y0 p9 T J* Q -
8 y Q6 F% j! ?. `9 M - // 读取文件名:用于设置客户端保存时指定默认文件名
$ M, N4 s" a9 t! v - int index = path.lastIndexOf("\"); // 前提:传入的path字符串以“\”表示目录分隔符
0 r4 V# y: }+ d; b4 Y$ L' d# D - String fileName = path.substring(index + 1); " o' s0 p7 c! E' g
- / R9 p0 X: v' ?/ d7 {* k% a
- // 写流文件到前端浏览器
, F2 P. m9 G0 o& [ - ServletOutputStream out = res.getOutputStream(); 5 j+ ]8 E6 Y. R
- res.setHeader("Content-disposition", "attachment;filename=" + fileName); ( g! _. a9 w4 T F# h
- BufferedInputStream bis = null;
1 h' A f9 o2 D2 ?- N - BufferedOutputStream bos = null;
& W- d2 X; v \& a, t8 X- v, z - try { % H l5 d9 p, P, D4 }* Q
- bis = new BufferedInputStream(new FileInputStream(path));
) K+ u, s1 e' U+ j - bos = new BufferedOutputStream(out);
6 U5 ^6 w7 g5 e* c& Q. r - byte[] buff = new byte[2048]; 6 r) ^* h" i& ?3 N) p
- int bytesRead; 3 S# D! O n6 o, l+ f
- while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) { 5 J9 B: Y, O$ A/ x- h
- bos.write(buff, 0, bytesRead);
- Y& L" a0 K; \" f5 k - }
# p4 M6 W% c* K - } catch (IOException e) {
2 ?' j- m0 M E9 g7 Z' l - throw e;
' ]' A& l x2 o( @' n" J - } finally { 5 K. i) Q3 z# d9 o& r2 l
- if (bis != null) 0 z$ V4 r. F0 W& c# D
- bis.close(); ' N4 L8 H2 J; c) H6 p
- if (bos != null) ) x+ O f7 ^. ?$ V/ c& o: s! z9 Y$ u
- bos.close(); # s( D9 [. L% q0 R+ ^: K
- } ( B9 a j" A% f7 {0 B
- }
. d2 }. g, c6 L/ \! z. |0 K/ Y6 m - # g5 x; m& O/ X/ t' b
- }
复制代码 web.xml 设置:
( b$ m8 J# E& \' y3 X" M; ?- <servlet> 9 o4 B& o2 b$ L. }
- <servlet-name>DownloadFile</servlet-name>
# E: b& X* h8 h0 @ - <servlet-class>downloadFile.DownloadFile</servlet-class> 9 A1 s/ N4 m% U; r$ u0 H4 \3 Z
- </servlet> 2 @+ M- W; L" U1 b0 V E' a
- <servlet-mapping>
' \# `. o9 a4 I - <servlet-name>DownloadFile</servlet-name> ! R6 o5 E. y" { a8 ~' b- e
- <url-pattern>/DownloadFile</url-pattern>
6 g! w* ~" o/ l1 d! v$ f( t& ~ - </servlet-mapping> " p8 X0 p" G. P
- </web-app>
复制代码 ( c' n5 ~3 v6 \1 i! g4 U/ J
如果此Servlet命名为downloadFile,请求的URL为:http://localhost:8888/upload/DownloadFile?path=web.txt ; t4 y; U4 W* i7 q
总结: 第一种方法我使用的jsp文件处理,并且使用第三方控件,简单的几行代码就搞定了,第二种方法是使用java语言写的,而且下载的文件是中文命名的话,还会出现乱码的问题.从此可以看出,站在巨人的肩膀上的重要性.
& I% [+ R; O3 I0 R
# n* Q0 g% g! k) i |