文件下载的几种方式:
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流方式。
------这几种方式都是比较原始的方式。