方法一:使用jsp实现:, Y3 {; W4 R# {4 e7 l N0 e8 d( \" ]
- <span style="font-family:FangSong_GB2312;font-size:18px;"><%@ page contentType="text/html;charset=gb2312" %>
* z0 j$ r; @/ C; Z+ ~ - <%@page import="com.jspsmart.upload.SmartUpload"%>
+ }# `9 }8 ~ ^. e* [/ v0 |' B# z' z! y4 c - <%@page import="com.jspsmart.upload.File"%>
; S7 W) ?) c C - <% # g5 f3 O$ Q% ]5 `8 n. w& K9 L K" T7 R
- //新建一个SmartUpload对象 3 t y% K' O" t/ p6 B8 ?
- SmartUpload su = new SmartUpload();
4 u) b" R8 ]" C" O, L/ X8 I7 }& ^ - //初始化
& [" v& ]) ?4 U - su.initialize(pageContext); 9 j6 ?7 y8 _; A: `
- //设定contentDisposition为null以禁止浏览器自动打开文件,保证单击链接后是下载文件。若不设定,则下载的文件扩展名为doc时,浏览器将自动用word打开它。扩展名为pdf时,浏览器将用acrobat打开。
/ v X/ W* j/ L8 R; [ ] - su.setContentDisposition(null);
; q7 [" M" A: T% K$ n) E: Y. i - //下载文件
$ c) J! V# `- x: U! G! L# Y W7 c - su.downloadFile("WEB-INF/upload/11.rar");
7 J4 E$ b; G: [8 y' H6 C - //处理输出流问题
& D8 R: j J" r9 F; F, T& p& U - out.clear();
, P4 O& l# A1 a Y. e - out = pageContext.pushBody();
4 a, _/ |$ I% j- f: A6 ^1 m. J/ p - %> l9 I1 `" F+ j, g
- </span>
复制代码 方法二:使用servlet 实现 :
/ h" R$ O8 I1 M- `: N% z- package downloadFile;
& q7 o) a! |; m7 }0 E! E& d9 C - ; m8 @. m9 e% o
- import java.io.BufferedInputStream;
5 _, m* C0 K; ]8 @ - import java.io.BufferedOutputStream; , ?# j9 L; p1 X
- import java.io.File;
; e$ {9 ]* [# S x G - import java.io.FileInputStream;
* ]1 x- G+ }+ z2 O3 o& \8 h$ j - import java.io.IOException; + p4 {; D( m; @! v. h: t
- import javax.servlet.ServletException;
, |" G( Y7 u+ S' t# P - import javax.servlet.ServletOutputStream;
/ h+ g5 A2 h; v - import javax.servlet.http.HttpServlet; ' g' I) {6 e2 t5 W @$ B" W
- import javax.servlet.http.HttpServletRequest;
2 y4 D( V# M, O" p - import javax.servlet.http.HttpServletResponse;
) d+ F' l8 Q+ R9 D -
! n u) ?% d8 U5 @4 q( [% h- R h - ' ~( y( A! P' ?( o. R0 z+ o' x2 \
- ) B+ V# x( c7 D
- public class DownloadFile extends HttpServlet {
- I) F: T! E; C+ W' `" @0 |8 [6 h! z - protected void service(HttpServletRequest req, HttpServletResponse res)
% A/ R0 {* e" T' Q) P0 k - throws ServletException, IOException { 5 F* |7 e5 V, m3 w% J# U5 g
- O0 F; ?5 ^1 E- J
- // 服务器相对路径 3 L: F" J }- a: J. f
- String path = req.getParameter("path"); 3 h' X: T+ {; g9 p: N
- // 服务器绝对路径 8 h" b' _* r( s" _
- path = getServletContext().getRealPath("/") + path; 2 B* j+ R* j' k0 x, X! Y
- 5 k* z! I/ h: C+ F/ w8 e) M/ K3 x
- // 检查文件是否存在
2 s4 s; f- U$ n$ t1 j+ J' v. V7 N) Q - File obj = new File(path); ) @0 L$ Y' b1 `& p
- if (!obj.exists()) { * [, R! }1 U3 Z
- res.setContentType("text/html;charset=GBK"); 8 E0 ]6 Z' b A5 R9 x1 A
- res.getWriter().print("指定文件不存在!"); ) Y% W! M, g( Z3 l. _& ?8 u9 u
- return;
( Z O, u# `$ t' K8 e7 W/ A - } ; K3 x& Y. k# x$ |' L/ c
- # h o1 H5 l- b" x/ {
- // 读取文件名:用于设置客户端保存时指定默认文件名
/ U% k4 ~( t! u' r" Y0 `5 c - int index = path.lastIndexOf("\"); // 前提:传入的path字符串以“\”表示目录分隔符 . ?% g( h/ ^' ^% M6 K
- String fileName = path.substring(index + 1);
1 l3 ` u) v N) s9 B$ J - 3 c: X) ^5 l& o' T1 b6 R
- // 写流文件到前端浏览器
& r* H7 K; E7 ?% P - ServletOutputStream out = res.getOutputStream(); & U# H2 b9 O2 a2 P
- res.setHeader("Content-disposition", "attachment;filename=" + fileName); 5 y! R+ P# |! C
- BufferedInputStream bis = null;
# |( @& X1 e3 b2 D+ O - BufferedOutputStream bos = null;
% p! x" B/ O; x2 K4 p4 \# p* M9 J - try { , H7 O6 t# {' B- h
- bis = new BufferedInputStream(new FileInputStream(path));
) o }& A7 v/ r3 f* p - bos = new BufferedOutputStream(out);
@6 _4 W& s. x* F4 M - byte[] buff = new byte[2048];
# ~ N4 v, g5 X - int bytesRead; $ D* f% Q/ U+ m9 M6 D! e( y, T
- while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
R- U9 L, h4 k7 k - bos.write(buff, 0, bytesRead); 2 F f& G, J/ ?& o5 g; o
- }
! P. z) G% i; V2 u9 \ - } catch (IOException e) { & V0 p% o& n* I g
- throw e; ! P0 r x7 n8 [
- } finally { ) ^5 ]- v5 Q! f7 H+ U! ?6 N3 P" [
- if (bis != null)
`2 H1 b) h- q: U - bis.close();
. N1 d G/ h( K& N4 ?- }9 f4 Q1 @ - if (bos != null)
4 F' T3 B" j6 ?- D. M3 J. k) W8 M, H - bos.close(); . g i# e( d$ o2 ?
- }
' V/ H# m8 z4 P - } - f' f I* y+ i$ l8 S
- 9 Y/ w5 I* s7 ~! r( g/ A3 [# L( p
- }
复制代码 web.xml 设置: 9 ~* R* `; b: F/ f; L
- <servlet>
% i: r& _) O1 W; i1 X4 f; D# L - <servlet-name>DownloadFile</servlet-name>
" u8 F6 d2 Z# D% D9 E0 U - <servlet-class>downloadFile.DownloadFile</servlet-class> - G. D4 e4 j5 K& R) ^ ^9 J' r+ h
- </servlet>
Q" q2 \. V/ H, U - <servlet-mapping>
, ?: X% l( K9 s0 Q& L - <servlet-name>DownloadFile</servlet-name>
0 ?3 t0 H! N3 w6 _ - <url-pattern>/DownloadFile</url-pattern>
; t7 F1 N" T4 Y$ @- a1 I# N - </servlet-mapping>
4 L8 z4 e' J1 E0 C H# w - </web-app>
复制代码 2 Y6 L8 h- F8 I6 s# D
如果此Servlet命名为downloadFile,请求的URL为:http://localhost:8888/upload/DownloadFile?path=web.txt 6 `' w6 P; t5 y- t8 U
总结: 第一种方法我使用的jsp文件处理,并且使用第三方控件,简单的几行代码就搞定了,第二种方法是使用java语言写的,而且下载的文件是中文命名的话,还会出现乱码的问题.从此可以看出,站在巨人的肩膀上的重要性. 1 K& Y) v. D6 D' ^3 [
9 {) j0 _' e4 k6 F F7 E, i5 e
|