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流方式。

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

原文地址:https://www.cnblogs.com/tongxuping/p/7041090.html