热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

JavaWeb应用程序实现基础的文件下载功能的实例讲解

这里我们演示了Servelet驱动Tomcat来进行HTTP下载的方法,接下来就详细来看JavaWeb应用程序实现基础的文件下载功能的实例讲解

基础思路:
之前的思路一直是弹出一个框问用户想要存放文件的位置,然后我再生成个文件放到那。然而我这个想法并没有成功。
点击链接来下载文件的方式很简便,后台把文件流输出来,通过浏览器实现下载功能,包括询问位置与文件存放,大多数浏览器会配置一个固定位置,不一定每次都问。
前端就非常简单了,一个标签,href=“后台方法地址”,如果你的需求不能直接用超链接方式,可以在js里写

window.location.href =“后台方法地址"。

这样跳转到后台方法后

String filePath = this.getClass().getClassLoader().getResource("").toURI().getPath()
     + "/exportPdf.pdf"; //文件在项目中的路径
  File outfile = new File(filePath);
  String filename = outfile.getName();// 获取文件名称
  InputStream fis = new BufferedInputStream(new FileInputStream(
     filePath));
  byte[] buffer = new byte[fis.available()]; 
  fis.read(buffer); //读取文件流
  fis.close();
  response.reset(); //重置结果集
  response.addHeader("Content-Disposition", "attachment;filename="
    + new String(filename.replaceAll(" ", "").getBytes("utf-8"),
    "iso8859-1")); //返回头 文件名
  response.addHeader("Content-Length", "" + outfile.length()); //返回头 文件大小
  response.setContentType("application/octet-stream"); //设置数据种类
  //获取返回体输出权
  OutputStream os = new BufferedOutputStream(response.getOutputStream()); 
  os.write(buffer); // 输出文件
  os.flush();
  os.close();

浏览器会直接识别这种形式的文件输出,弹出对话框。
注意此方法一定要用链接方式调后台,使用ajax和XMLHttpRequest方式都是不行的,这样返回的文件流会返回到方法的回调函数中,当然如果你想在js中获取文件,这样也行。


实例

package cn.itcast.day06.web.servlet;
 
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
 
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class DownloadServlet extends HttpServlet {
 
 public void doGet(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
 
 // 实现防盗链功能
 // 获得 referer 头 用于说明来访者来自哪里
 String referer = request.getHeader("referer");
 if(referer==null || !referer.startsWith("http://localhost")) {
  // 是盗链者
  response.sendRedirect("/day06/index.jsp");
  return ;
 }
 
 
 // 解决response中文乱码问题
 response.setContentType("text/html;charset=utf-8"); // 设置消息体的编码
 
 
 // 通过 http 协议 发送的http响应消息头 不能出现中文 中文必须要经过url编码
 String filename = URLEncoder.encode("美女.jpg", "utf-8");
 
 // 通知浏览器以下载的方式读取资源
 response.setHeader("content-disposition", "attachment;filename="+filename);
 
 // 读取图片数据 发给ie浏览器
 String webPath = "/download/美女.jpg"; // 相当于当前web应用的path
 
 ServletContext servletCOntext= super.getServletContext();
 
 InputStream in = servletContext.getResourceAsStream(webPath);
 
 
 OutputStream out = response.getOutputStream();
 
 
 int len;
 byte[] buffer = new byte[1024];
 while((len=in.read(buffer))!=-1)
  out.write(buffer, 0, len);
 
 }
 
 public void doPost(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
 doGet(request, response);
 }
 
}


推荐阅读
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文介绍了Svn和Maven的使用说明,包括版本控制和构建工具的功能和优势。同时提供了一个相关链接,链接中详细介绍了SvnMaven的使用方法和注意事项。通过学习和使用SvnMaven,开发人员可以更好地进行代码管理、软件开发和协作开发,提高项目管理的效率和质量。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
author-avatar
罂粟花wd2010
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有