zoukankan      html  css  js  c++  java
  • Java文件下载

    文件下载的几种方式:  

      1、超链接的方式     ---- 直接在页面上添加  a  标签给个链接即可
        优点:开发简单,之间通过超链接即可完成。
        缺点:非压缩包的文件(.jpg,.png,.gif,.doc,.txt..)则直接在浏览器中打开。
        建议:所有的文件都是压缩包时,可以使用该中方式。
      2、使用IO流的方式。

    //jsp  
    <a href="${pageContext.request.contextPath }/DownLoadServlet2?fname=mm.jpg">美女(mm.jpg)</a><br/>
    public class DownLoadServlet extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //1、接收参数
            String fname = request.getParameter("fname");
            //2、创建输入流对象
            InputStream in = new FileInputStream(getServletContext().getRealPath(fname));
            //3、创建输出流对象
            OutputStream out = response.getOutputStream();
            //4、告设置头通知,告知浏览器以附件下载的方式打开
            response.setHeader("Content-Disposition","attachment;filename="+fname);
            //5执行io操作
            byte[] bts = new byte[1024];
            int len = -1;
            while((len=in.read(bts))!=-1){
                out.write(bts,0,len);
            }
            //6、关闭流
            out.close();
            in.close();
        }
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
            doGet(request, response);
    
        }
    }

      3、文件转发的方式
        一般的文件可以使用该中方式,如果遇到超大文件或优化下载效率已经实现断点续传...建议使用IO操作的方式。

    //时间戳工具类
    public class TimeUtils {
        public static String getSimpleTime(){
            Date date = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
            return sdf.format(date);
        }
        public static String getIPSimpleTime(String ip){
            String ips[] = ip.split(".");
            String result = "";
            for (int i = 0; i < ips.length; i++) {
                result+=ips[i];
            }
            Date date = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
            result += sdf.format(date);
            return result;
        }
    //下载的servlet
    public class DownLoadSaleInfosServlet extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            //1、创建业务层对象
            OrderService orderService = BasicFactory.getFactory().getInstance(OrderService.class);
            //2、调用查询的方法:前100条
            List<SaleInfo> list = orderService.findSaleInfos(100);
            //3、拼接
            StringBuffer stringBuffer = new StringBuffer("商品id,商品名称,销售总量
    ");
            for (SaleInfo saleInfo : list) {
                stringBuffer.append(saleInfo.getProd_id()+",").
                    append(saleInfo.getProd_name()+",").
                    append(saleInfo.getSale_num()+"
    ");
            }
            //4、告知浏览器以附件下载的方式
            String fname=TimeUtils.getSimpleTime();
            response.setHeader("Content-Disposition", "attachment;filename="+fname);
          //处理乱码
          response.setContentType("text/html;charset=gbk");
    
            //5、将结果通过响应流传输给浏览器
            response.getWriter().write(stringBuffer.toString());
        }
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
            doGet(request, response);
    
        }
    }

    总结:
      如果仅仅是几个压缩包下载的话,建议使用超链接。
      如果下载的文件各种类型的都有,不建议使用超链接的方式;
      可以选择后两种方式,如果文件都不是太大的话,自由选择;如果文件想
      实现一些自定义的一些功能(比如断点续传)建议使用IO流方式。

    ------这几种方式都是比较原始的方式。

  • 相关阅读:
    Java 从入门到进阶之路(五)
    Java 从入门到进阶之路(四)
    Java 从入门到进阶之路(三)
    Java 从入门到进阶之路(二)
    Java 从入门到进阶之路(一)
    调用百度翻译 API 来翻译网站信息
    jquery.i18n 网站呈现各国语言
    VUE+Element UI实现简单的表格行内编辑效果
    Python 爬虫从入门到进阶之路(十八)
    Python 爬虫从入门到进阶之路(十七)
  • 原文地址:https://www.cnblogs.com/tongxuping/p/7041090.html
Copyright © 2011-2022 走看看