>>分享孙卫琴的Java技术专稿和著作 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 12782 个阅读者 刷新本主题
 * 贴子主题:  【Spring专题】用Spring框架进行文件下载 回复文章 点赞(0)  收藏  
作者:sunweiqin    发表时间:2021-10-09 12:11:28     消息  查看  搜索  好友  邮件  复制  引用

本文参考《精通Spring:JavaWeb开发技术详解》,作者:孙卫琴,清华大学出版社出版

把服务器端的文件发送到客户端,这个过程称为文件下载。在Spring MVC框架中,
org.springframework.http.ResponseEntity.BodyBuilder接口具有文件下载的功能。BodyBuilder接口提供了生成响应结果的各种方法:

(1)body(T body) :返回表示响应结果的ResponseEntity对象。
2)contentLength(long contentLength) :设置响应正文的长度。
(3)contentType(MediaType contentType) :设置响应正文的类型。
(4)header(String headerName, String... headerValues) :设置响应头中的特定项。

在本范例中,FileController类的download()方法通过BodyBuilder接口来下载文件:
Java@RequestMapping("/download")
public ResponseEntity<byte[]>
download(
         HttpServletRequest request,String filename,
         @RequestHeader("User-Agent") String userAgent)
         throws IOException {

  //下载文件的路径
  String path= request.getServletContext().getRealPath("/mydata");

  //创建表示下载文件的File对象
  File file =new File(path + File.separator + filename);

  //创建用于生成响应结果的BodyBuilder对象,响应状态代码为200
  ResponseEntity.BodyBuilder builder = ResponseEntity.ok();

   //设置响应正文长度
  builder.contentLength(file.length());

   //设置响应正文类型application/octet-stream二进制数据流,
   //这是最常见的文件下载类型
  builder.contentType(MediaType.APPLICATION_OCTET_STREAM);

   // 使用URLEncoding.decode对文件名进行解码
  filename =URLEncoder.encode(filename, "UTF-8");

  // 根据浏览器类型,决定"Content-Disposition"响应头的值
  if(userAgent.indexOf("MSIE") > 0) {
    builder.header("Content-Disposition",
                       "attachment;filename=" + filename);
  } else {
     builder.header("Content-Disposition",
                       "attacher;filename*=UTF-8''" + filename);
  }
  //返回包含下载文件数据的响应结果
  return builder.body(getBytesFromFile(file));
}
  
/** 把文件中的内容读入到一个字节数组中 */
private byte[] getBytesFromFile(File file)throwsIOException{
   FileInputStream fileInputStream = new FileInputStream(file);

  //获取文件大小
  intlength=fileInputStream.available();
        
  //读取文件字节,存放在字节数组中
  intbytesRead=0;

  byte[]buff=new byte[length];

  while(bytesRead<length) {
    intresult=
          fileInputStream.read(buff,bytesRead,length-bytesRead);

    if(result==-1)
       break;

    bytesRead+=result;
  }

  fileInputStream.close();

  return buff;
}

FileController类的download()方法的filename参数就表示需要从服务器端下载的文件名字。

download()方法通过BodyBuilder对象来生成包含下载文件数据的响应结果,它的响应正文的类型为
MediaType.APPLICATION_OCTET_STREAM,实际取值为“application/octet-stream”。

浏览器端收到这样的响应结果,会把服务器端的特定图片文件中的数据下载到客户端。




程序猿的技术大观园:www.javathinker.net
  Java面向对象编程-->面向对象开发方法概述之开发思想(上)
  JavaWeb开发-->自定义JSP标签(Ⅰ)
  JSP与Hibernate开发-->Java应用分层架构及软件模型
  Java网络编程-->用Spring整合CXF发布Web服务
  精通Spring-->组合(Composition)API
  Vue3开发-->通过Axios访问服务器
  【Vue.js技术专题】Vue组件的数据监听
  【Vue.js技术专题】自定义指令范例:v-drag指令
  【持久化专题】为什么JPA和Hibernate的持久化方法都抛出运行...
  【Spring专题】RestTemplate类与RESTFul风格的请求
  【持久化专题】JPA API的基本用法
  【持久化专题】对象-关系的映射概念
  【持久化专题】映射Bag包(值类型的集合)
  【Java网络编程专题】创建基于SSL的安全服务器和安全客户的范...
  【JavaWeb专题】在Servlet中利用Apache开源类库实现文件上传
  【JavaWeb专题】Tomcat与IIS集成详解
  IT技术书写作技巧分享:慎用概念和术语
  《大话Java程序设计从入门到精通》写作花絮
  【Java基础编程专题】Java集合的批量操作
  【Java基础编程专题】用内部类实现回调
  【Java基础编程专题】Java继承的利弊和使用原则
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。