>>分享孙卫琴的Java技术专稿和著作 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 12920 个阅读者 刷新本主题
 * 贴子主题:  【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
网站系统异常


系统异常信息
Request URL: http://www.javathinker.net/WEB-INF/lybbs/jsp/topic.jsp?postID=3971&pages=4

java.lang.NullPointerException

如果你不知道错误发生的原因,请把上面完整的信息提交给本站管理人员