我的日常

登录/注册
您现在的位置:论坛 盖世程序员(我猜到了开头 却没有猜到结局) 盖世程序员 > java实现文件下载功能(SmartUpload)
总共48087条微博

动态微博

查看: 1678|回复: 0

java实现文件下载功能(SmartUpload)

[复制链接]

45

主题

5

听众

119

金钱

三袋弟子

该用户从未签到

跳转到指定楼层
楼主
发表于 2014-08-05 21:53:21 |只看该作者 |倒序浏览
方法一:使用jsp实现:$ P  u0 F, ]+ `
  1. <span style="font-family:FangSong_GB2312;font-size:18px;"><%@ page contentType="text/html;charset=gb2312" %>  5 N2 y  G1 R& }4 D
  2. <%@page import="com.jspsmart.upload.SmartUpload"%>    ; V% R9 c( ^5 z& G' i( W
  3. <%@page import="com.jspsmart.upload.File"%>     e4 T4 y# L% q+ n9 i
  4. <%  
    ! f/ T. v$ g- i2 T' p: K8 i  ?
  5.     //新建一个SmartUpload对象  
    ) C5 W( G' Y& G7 j& k
  6.     SmartUpload su = new SmartUpload();  2 @/ S; o. }' H: }
  7.     //初始化  ) H. }# T3 K# a/ h" A$ z
  8.     su.initialize(pageContext);   
    8 M1 H. [, C, \8 u
  9.     //设定contentDisposition为null以禁止浏览器自动打开文件,保证单击链接后是下载文件。若不设定,则下载的文件扩展名为doc时,浏览器将自动用word打开它。扩展名为pdf时,浏览器将用acrobat打开。  
    6 P1 n2 Y* T5 S4 P7 s/ h  E
  10.     su.setContentDisposition(null);  
    ) W: r$ I- x# U4 c
  11.     //下载文件   5 e4 R+ u* C1 x) e% L
  12.     su.downloadFile("WEB-INF/upload/11.rar");  8 _( e" q% f' ^; B, @5 _: f- ?9 b: m
  13.     //处理输出流问题  7 R5 A% K( _8 y" \
  14.     out.clear();  5 s9 K( v$ }5 X0 c& {' Q
  15.     out = pageContext.pushBody();  , Q; N8 |/ n% y) ~2 n/ }0 }
  16. %>  
    4 {9 y6 T, H1 ?9 v, ~3 B
  17. </span>
复制代码
方法二:使用servlet 实现# {+ A. `$ R5 Z1 E4 d- }  i
  1. package downloadFile;  
    ! \) z6 `' f/ {: k( c# h" u
  2.   ! C0 M2 M- l! s
  3. import java.io.BufferedInputStream;  
    ( K- |" v9 l4 K9 P% D! r
  4. import java.io.BufferedOutputStream;  % j1 \1 ~/ M& q7 r3 l9 M
  5. import java.io.File;  $ h( V+ x* d3 F3 P0 H2 ?
  6. import java.io.FileInputStream;    Q9 z; z8 [8 V7 O  J
  7. import java.io.IOException;  8 n: ^9 ]  `) G8 l
  8. import javax.servlet.ServletException;  ; \+ Z0 c7 @/ V9 X, _
  9. import javax.servlet.ServletOutputStream;  
    ' {" U5 ?6 ~3 D1 M0 ~
  10. import javax.servlet.http.HttpServlet;  & L8 F0 G: P6 I% F4 U
  11. import javax.servlet.http.HttpServletRequest;  3 I& ]4 Y3 w" a( d: v$ @
  12. import javax.servlet.http.HttpServletResponse;  # S+ \# K- @5 @) c4 v: w
  13.   " C  k3 H: Z1 I! r3 V( i
  14.   ' n( |% B- n( k
  15.   ) H( N( G' R% `8 ~
  16. public class DownloadFile extends HttpServlet {  
      y* D) y3 X, y
  17.     protected void service(HttpServletRequest req, HttpServletResponse res)  
    " _) F2 i! I3 o% }; M3 c/ k: _2 F
  18.               throws ServletException, IOException {  $ N1 D* A3 W* z
  19.   
    ( Q. ]! ?% l0 |/ l+ ]
  20.             // 服务器相对路径  . |9 [4 [% U. O! l# h
  21.             String path = req.getParameter("path");  0 V' z" }" W) W; e, E) ]
  22.             // 服务器绝对路径  . P3 R; y( ]% l  d1 Q4 B# _
  23.             path = getServletContext().getRealPath("/") + path;  ! n$ d4 \% d' |' D
  24.   4 h: c* D) K" J; p$ |( `" t8 @$ e
  25.             // 检查文件是否存在  3 m6 j9 m  z" [& T7 u
  26.             File obj = new File(path);  8 o" _/ P' l& M. C& p$ d' ?
  27.             if (!obj.exists()) {  3 ^7 ~- N' X% z/ @) i$ z5 |
  28.               res.setContentType("text/html;charset=GBK");  2 B* r9 O* t8 ^9 {' a
  29.               res.getWriter().print("指定文件不存在!");  
    # Y$ l- l/ ?7 @' r* G; W  L
  30.               return;  5 g, z  T% q5 ~* X9 k6 l0 W
  31.             }  
    % Z2 n( T5 y: t4 `
  32.   / O6 Y7 W+ Y- D' W. P
  33.             // 读取文件名:用于设置客户端保存时指定默认文件名  
    2 _% h7 C* x# C0 v( u6 K0 s+ o
  34.             int index = path.lastIndexOf("\"); // 前提:传入的path字符串以“\”表示目录分隔符  
    # S- Z% j3 W# l
  35.             String fileName = path.substring(index + 1);  " _! Q! H% x7 g4 K% h+ y/ k0 ]5 Z! H- _
  36.   
    6 c/ @9 u% @7 `! x6 y5 f
  37.             // 写流文件到前端浏览器  
    ' Z  e$ j3 V9 ?7 R
  38.             ServletOutputStream out = res.getOutputStream();  6 J7 D7 U. S' Z/ D4 `
  39.             res.setHeader("Content-disposition", "attachment;filename=" + fileName);  
    4 _1 w4 I7 X# c. X# h! v; m
  40.             BufferedInputStream bis = null;  
    " r" Y: K% p- h& K0 Q
  41.             BufferedOutputStream bos = null;  
    6 h" E1 t" X9 W4 V
  42.             try {  
    - c6 z  g9 W! v. _& U) Q: f
  43.               bis = new BufferedInputStream(new FileInputStream(path));  / j& I4 \! D$ t) |
  44.               bos = new BufferedOutputStream(out);  
    : t+ `( u  M* A/ I2 }$ C
  45.               byte[] buff = new byte[2048];  ) `" N+ |4 U6 {
  46.               int bytesRead;  
    & W7 F" c% \  h' V. l) }! M% ?
  47.               while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {  
    : `5 z! e3 u* L: D  y
  48.                 bos.write(buff, 0, bytesRead);  & }/ D7 o1 g- |5 ]8 s
  49.               }  8 W$ e; ]- _% Z4 y" m
  50.             } catch (IOException e) {  
    9 c7 O+ y+ W5 c) P
  51.               throw e;  
    # s0 ^2 Q+ ]( ]
  52.             } finally {  
    ' C" Y. t3 I- U
  53.               if (bis != null)  
    : G3 E& R$ G% L$ H  f, _; P7 O
  54.                 bis.close();  , }4 F4 o8 h5 S: m3 u3 W
  55.               if (bos != null)  0 X4 i5 `  @1 X6 J3 q
  56.                 bos.close();  - M/ h1 C* t/ t# I! K5 y
  57.             }  : H0 ^, B! y% h' _6 p
  58.           }  $ \1 u' L2 ~6 e- s
  59.   , w/ k* L% W0 `1 X; o8 j
  60.         }  
复制代码
web.xml 设置:
/ y2 A+ r- W+ e' q
  1. <servlet>  
    4 P# Y# ?1 [. e( u* `
  2.     <servlet-name>DownloadFile</servlet-name>  * S7 E- B- x' T
  3.     <servlet-class>downloadFile.DownloadFile</servlet-class>  
    / |3 z+ C6 R" E
  4. </servlet>  8 ]6 W  k5 E5 \+ Y$ {
  5. <servlet-mapping>  - _+ Q: L  f/ C- B
  6.     <servlet-name>DownloadFile</servlet-name>  ( k2 J, ^1 [& _" o( m- V: B
  7.     <url-pattern>/DownloadFile</url-pattern>  
    8 [+ L( m. B) C5 [! c, a  J. d
  8. </servlet-mapping>  $ }- `, Y+ k/ D$ Q, {
  9. </web-app>
复制代码

" j1 K9 M, d% l' n" O如果此Servlet命名为downloadFile,请求的URL为:http://localhost:8888/upload/DownloadFile?path=web.txt . v2 I7 W* W# j0 S' l3 Q6 G- D, Z7 r0 A

总结:

     第一种方法我使用的jsp文件处理,并且使用第三方控件,简单的几行代码就搞定了,第二种方法是使用java语言写的,而且下载的文件是中文命名的话,还会出现乱码的问题.从此可以看出,站在巨人的肩膀上的重要性.


* H! S- C) D+ c4 a% M
3 a/ H4 |3 B, J( P

科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、科帮网管理员和版主有权不事先通知发贴者而删除本文


JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

快速回复
您需要登录后才可以回帖 登录 | 立即注册

   

关闭

站长推荐上一条 /1 下一条

发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
快速回复 返回顶部 返回列表