通过实例了解如何在JavaWeb实现文件下载

 更新时间:2020年09月09日 11:32:39   作者:Cushier  
这篇文章主要介绍了通过实例了解如何在JavaWeb实现文件下载,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

文件下载的方式

  • 超链接下载
  • 后台实现下载

案例实操

超链接下载

当我们在 HTML 或 JSP 页面中使用标签时,原意是希望能够进行跳转,但当超链接遇到浏览器不识别的动态网页时则会自动下载。如果浏览器遇到能够直接显示的资源,浏览器就会默认显示出来,比如 txt,png,jpg 等。当然我们也可以通过 download 属性规定浏览器进行下载。但有些浏览器并不支持。

默认下载

<a href="upload/abc.zip" rel="external nofollow" >超链接下载</a>

指定 download 属性下载

<a href="upload/abc.txt" rel="external nofollow" download="abcdef.txt">超链接下载</a>

这里,download 也可以不写任何信息,会自动使用默认文件名。这样当用户打开浏览器点击链接的时候就会直接下载文件。

后台实现下载

Step1:需要通过 HttpServletResponse.setContentType 方法设置 Content-type 头字段的值,这样浏览器才能够使用某种方式或激活某个程序来处理相应 MIME 类型的数据,例 如 ”application/octet-stream” 或 ”application/x-msdownload” 等

Step2:需要通过 HttpServletResponse.setHeader 方法设置 Content-Disposition 头的值为”attachment;filename=文件名”,filename提供了文件下载时的一个默认文件名

Step3:读取下载文件,调用 HttpServletResponse.getOutputStream 方法返回的OutputStream对象来向客户端写入附件内容。

public class DownLoadServlet extends HttpServlet {
  private static final long serialVersionUID = 1L;

  protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    // 设置请求编码
    request.setCharacterEncoding("UTF-8");
    // 接受参数,得到需要被下载的文件的名称
    String fileName = request.getParameter("fileName");
    // 判断名字名是否为空
    if(fileName == null || "".equals(fileName)){
      // 提示
      System.out.println("文件名不能为空");
      return;
    }
    // 获取文件存放的真实路径
    String path = request.getServletContext().getRealPath("/" + fileName);
    // 通过文件路径和文件名得到file对象
    File file = new File(path);
    // 判断是否存在,并且是一个标准文件
    if (file.exists() && file.isFile()){
      // 设置相应类型 application/octet-stream
      response.setContentType("application/x-msdownload");
      // 设置头信息
      response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
      // 通过file对象得到输入流
      FileInputStream in = new FileInputStream(file);
      // 得到输出流
      ServletOutputStream out = response.getOutputStream();
      byte[] car = new byte[1024];
      int len = 0;
      while((len = in.read(car)) != -1){
        out.write(car,0,len);
      }
      // 关闭流
      in.close();
      out.close();
    } else {
      System.out.println("文件路径不正确!");
    }

  }

}

扩展~HTML表单编码

HTML表单编码
enctype属性指定浏览器如何编码数据并将其呈现给服务器。

此属性有三个允许值。

application/x-www-form-urlencoded
默认编码。

此编码无法用于将文件上传到服务器。

multipart/form-data

此编码用于将文件上传到服务器。

text/plain

此编码因浏览器而异。

要理解不同编码的工作原理,我们创建了以下形式。

<!DOCTYPE HTML>
<html>
<body>
 <form method="post" action="http://example.com/form">
  <input name="fave" /> 
  <input name="name" />
  <button>Submit Vote</button>
 </form>
</body>
</html>

application/x-www-form-urlencoded

如果使用application / x-www-form-urlencoded编码,每个数据项的名称和值都使用用于编码URL的相同方案进行编码。这是编码应用于示例形式的数据的方式:

fave=Apples&name=FiratName+LastName

特殊字符将替换为其HTML实体对应部分。数据项的名称和值由等号(=)分隔,数据/值元组由&符号(&)分隔。

multipart/form-data

multipart / form-data编码往往仅用于上传文件。下面是示例表单中的数据如何编码:

------WebKitFormBoundary2desQWER543CDFGF

Content-Disposition: form-data; name="fave" YourName
------WebKitFormBoundary2desQWER543CDFGF Content-Disposition: form-data; name="name" www.lezijie.cn
------WebKitFormBoundary2desQWER543CDFGF-- fave=Apple
name=www.lezijie.cn
multipart/plain

主流浏览器以不同的方式对该编码进行编码。

Google Chrome以与application / x-www-form-urlencoded方案相同的方式对数据进行编码,而Firefox对数据进行编码的方式如下:

fave=xml
name=www.lezijie.cn

每个数据项都放在一行上,不会对特殊字符进行编码。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • ruoyi微服务版本搭建运行方式

    ruoyi微服务版本搭建运行方式

    这篇文章主要介绍了ruoyi微服务版本搭建运行方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 使用HttpClient实现文件的上传下载方法

    使用HttpClient实现文件的上传下载方法

    下面小编就为大家带来一篇使用HttpClient实现文件的上传下载方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • 详解Spring Retry实现原理

    详解Spring Retry实现原理

    这篇文章主要介绍了详解Spring Retry实现原理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • SpringBoot整合之SpringBoot整合MongoDB的详细步骤

    SpringBoot整合之SpringBoot整合MongoDB的详细步骤

    这篇文章主要介绍了SpringBoot整合之SpringBoot整合MongoDB的详细步骤,本文通过图文实例代码相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • Java实战角色权限后台脚手架系统的实现流程

    Java实战角色权限后台脚手架系统的实现流程

    只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+Springboot+Maven+myBaits-Plus+Vue+Element-UI+Mysql实现一个角色权限后台脚手架系统,大家可以在过程中查缺补漏,提升水平
    2022-01-01
  • Spring中Controller和RestController的区别详解

    Spring中Controller和RestController的区别详解

    这篇文章主要介绍了Spring中Controller和RestController的区别详解,@Controller是标识一个Spring类是Spring MVC controller处理器,@Controller类中的方法可以直接通过返回String跳转到jsp、ftl、html等模版页面,需要的朋友可以参考下
    2023-09-09
  • SprinBoot整合Quart实现定时调度的示例代码

    SprinBoot整合Quart实现定时调度的示例代码

    这篇文章主要介绍了SprinBoot整合Quart实现定时调度的示例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • SpringBoot 整合 Quartz 定时任务框架详解

    SpringBoot 整合 Quartz 定时任务框架详解

    这篇文章主要介绍了SpringBoot整合Quartz定时任务框架详解,Quartz是一个完全由Java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制
    2022-08-08
  • 深入解析SpringBatch适配器

    深入解析SpringBatch适配器

    Spring Batch是Spring的一个子项目,使用Java语言并基于Spring框架为基础开发,使得已经使用 Spring 框架的开发者或者企业更容易访问和利用企业服务,本文给大家介绍SpringBatch适配器的相关知识,感兴趣的朋友一起看看吧
    2021-11-11
  • 解决springboot无法注入JpaRepository的问题

    解决springboot无法注入JpaRepository的问题

    这篇文章主要介绍了解决springboot无法注入JpaRepository的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01

最新评论