方法一:使用jsp实现:
3 q- m; v4 {' k& J) _& X- <span style="font-family:FangSong_GB2312;font-size:18px;"><%@ page contentType="text/html;charset=gb2312" %>
3 T5 m' V4 G1 o - <%@page import="com.jspsmart.upload.SmartUpload"%>
6 @1 C) c$ C* \+ \# n) c! b X1 @" h3 i4 Y - <%@page import="com.jspsmart.upload.File"%> 1 k3 ?, S7 |3 n* \6 }1 O
- <% , J% }* \3 d! q; G$ H
- //新建一个SmartUpload对象
4 v; j `. W# D$ J& k - SmartUpload su = new SmartUpload();
\+ V$ L8 P# [. q% O- c - //初始化 / h2 T1 d" @1 V9 ]
- su.initialize(pageContext); 1 v: X3 O+ q: ~. d. D" f7 K
- //设定contentDisposition为null以禁止浏览器自动打开文件,保证单击链接后是下载文件。若不设定,则下载的文件扩展名为doc时,浏览器将自动用word打开它。扩展名为pdf时,浏览器将用acrobat打开。 # N- ?; a2 V; O6 r; K
- su.setContentDisposition(null);
: I3 D2 t3 \! |+ Q4 |0 Y - //下载文件
- O2 C) p0 E7 G2 o: I - su.downloadFile("WEB-INF/upload/11.rar");
% C& w/ B2 D2 a9 f# y - //处理输出流问题 * h" H& g- m0 n
- out.clear();
5 H( T$ \. M. c, u( W8 Z! J7 V - out = pageContext.pushBody(); 5 {$ r2 Y9 S4 W4 P5 z
- %> - b! c3 [2 o. j7 c* d& @
- </span>
复制代码 方法二:使用servlet 实现 :1 G4 Y5 y, O+ ]& \# l8 D
- package downloadFile; ) N/ T- _# g+ j' E& _
- 0 y& b1 O8 Z8 |+ U" `
- import java.io.BufferedInputStream; . w" k6 p# Q) u$ o
- import java.io.BufferedOutputStream;
& O E b2 l0 d; p9 o - import java.io.File; + M5 R+ E d) B/ F
- import java.io.FileInputStream; ) C. d/ `# t( I( d. h# H% L
- import java.io.IOException; N/ @# e7 v" }8 W
- import javax.servlet.ServletException;
; _! s2 S7 y3 t5 Z - import javax.servlet.ServletOutputStream; % V# P" d" `) N0 X
- import javax.servlet.http.HttpServlet;
4 C" b3 X3 r( W - import javax.servlet.http.HttpServletRequest; 9 Z: s' ^; f3 }! k- j' a# P/ r* Y
- import javax.servlet.http.HttpServletResponse; G: C: {; Q$ g& z5 Q4 e; E
- $ E: B' |2 l& ~! i' o+ P
-
2 n! |* s/ \2 O% N" | - . k; s' Y* P5 t2 }6 G
- public class DownloadFile extends HttpServlet {
7 N/ s" G& U* g- X9 ~" z& W - protected void service(HttpServletRequest req, HttpServletResponse res)
5 h- N' N2 m2 c. k7 r" d& _ - throws ServletException, IOException {
+ o9 U8 w) k! h -
/ U u) [- n% \+ j1 [: M, ^ - // 服务器相对路径
8 a/ V# z; F( z S) m# D y - String path = req.getParameter("path"); 4 Q/ g5 E" }8 ?% }& k4 ` w
- // 服务器绝对路径 + c" J, l1 T; i8 |- q) i: d# Q
- path = getServletContext().getRealPath("/") + path;
0 K$ S" G2 c7 R6 T9 X - , x; f) {, |& q4 ]8 H) n5 K* t* h
- // 检查文件是否存在 ; E, J5 V6 c) q7 f/ ?/ s
- File obj = new File(path); 7 O& s5 r/ Y7 [
- if (!obj.exists()) { ( A5 j( b6 R* s+ V' C! O
- res.setContentType("text/html;charset=GBK"); 2 q6 e( t1 S* L+ g
- res.getWriter().print("指定文件不存在!"); . h' o3 t" T$ }: j( O$ w
- return; + u1 l9 V* O5 t# y/ W" E
- } " `+ I& @5 a' m! q- k
-
7 a6 O$ |" {" t" U9 Y - // 读取文件名:用于设置客户端保存时指定默认文件名 : W- |) s; I7 W* n7 Q' W8 H
- int index = path.lastIndexOf("\"); // 前提:传入的path字符串以“\”表示目录分隔符
4 G1 i9 @' P/ v - String fileName = path.substring(index + 1); ' x; U8 S0 F/ m( o
-
) c4 u. P4 V- `1 M! N - // 写流文件到前端浏览器 3 D- a, [7 ~; c0 V+ Q+ K
- ServletOutputStream out = res.getOutputStream();
) V: q6 L+ k# l - res.setHeader("Content-disposition", "attachment;filename=" + fileName);
9 o R& B3 j% H, B - BufferedInputStream bis = null;
! C) e, [ P2 |3 m* M+ h1 k% f0 Q" \ - BufferedOutputStream bos = null;
3 {7 M J( a3 B* h# F } - try { 6 X; M1 k' `! `& ~ y) O/ w
- bis = new BufferedInputStream(new FileInputStream(path)); : T5 W+ s5 |! Z. O
- bos = new BufferedOutputStream(out); + i1 t- a7 u) ]# I$ T" p% p$ n2 S
- byte[] buff = new byte[2048]; 5 p3 N9 V" e% j2 K6 I0 v; M
- int bytesRead;
: p# o% e% Y! F/ E - while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) { # J, y& G' Q3 L+ T; f
- bos.write(buff, 0, bytesRead); F2 I7 X+ H& i' k
- } . N3 ] j' ~& E, G
- } catch (IOException e) {
4 Y0 L( a# V6 _: J - throw e;
5 d3 s9 G- _$ x& {. k! J9 ?. H) d - } finally { 8 `% W; t- ~# g9 E1 l7 V
- if (bis != null) , g' `0 W8 B: N0 N
- bis.close(); 3 D- A- l0 @+ N4 i
- if (bos != null)
9 y6 P* A9 W2 q! Q/ M& p3 p - bos.close(); ( H. E8 y* [$ s( T
- }
7 U+ L" b* ~9 n- o - } / O6 J0 I! M1 P8 B$ R$ z5 S2 }! N
-
2 e# i; P; ?! {' c& A" a7 w3 n - }
复制代码 web.xml 设置: 4 Y6 z, S0 l* }$ P, v0 E! n
- <servlet>
; A2 f, f' Q4 t* [ - <servlet-name>DownloadFile</servlet-name>
9 {) A8 b4 l1 p. w - <servlet-class>downloadFile.DownloadFile</servlet-class> b- I* b8 F- N
- </servlet>
% P' D; f, [9 D: }* s5 F - <servlet-mapping> ; E7 t1 O! m+ ^- `" V
- <servlet-name>DownloadFile</servlet-name> ' f' I; B1 k/ p( f" v$ t
- <url-pattern>/DownloadFile</url-pattern>
" y6 Q# y" b2 ^6 n3 C) \ - </servlet-mapping>
2 V/ [0 w6 ~' ^ - </web-app>
复制代码
+ M4 }( b* E# r" K; Q如果此Servlet命名为downloadFile,请求的URL为:http://localhost:8888/upload/DownloadFile?path=web.txt 4 C/ O- D5 D! W# G7 w& `2 \
总结: 第一种方法我使用的jsp文件处理,并且使用第三方控件,简单的几行代码就搞定了,第二种方法是使用java语言写的,而且下载的文件是中文命名的话,还会出现乱码的问题.从此可以看出,站在巨人的肩膀上的重要性.
* f1 Q9 a6 |: x( P- b- [8 \ ^9 P M" k% z# m# D1 j
|