温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么在Spring Mvc中以文件流方式下载文件

发布时间:2021-05-27 17:58:00 来源:亿速云 阅读:198 作者:Leah 栏目:编程语言

本篇文章给大家分享的是有关怎么在Spring Mvc中以文件流方式下载文件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

function downloadFile(filePath,fileName){
 
 fileName = fileName.substr(0,fileName.lastIndexOf("."));
 $.ajax({
   async : false, 
   cache:false, 
   type: 'get',
   dataType : "json", 
   url: RootPath() + "/checkDownload",//请求的action路径 
   data:{url:filePath},
   error: function () {//请求失败处理函数 
     alert("下载失败");
   }, 
   success:function(json) { //请求成功后处理函数。
   var code = json.code;
   if(code) {
    window.location.href = RootPath()+"/todownload?url="+filePath+"&name="+fileName;
   }else {
    layer.alert(fileName+' 文件不存在'); 
   }
   } 
 });
 
}

该ajax调用后台(checkDownload)方法,首先判断从该url能否获得指定下载的文件,如果获取不到,方法返回参数code=0,页面弹出“...文件不存在”。

 @RequestMapping("/checkDownload")
 @ResponseBody
 public Result checkDownload(String url,HttpServletResponse response) {
 Result result = Result.createSuccessResult();
 HttpURLConnection conn = null;
 try {
  URL path = new URL(url);
  conn = (HttpURLConnection) path.openConnection();
  conn.setRequestMethod("GET");
  conn.setConnectTimeout(5 * 1000);
  conn.getInputStream();// 通过输入流获取数据
 } catch (IOException ex) {
  result.setCode(0);
  ex.printStackTrace();
 }finally {
  if(conn != null) {
  conn.disconnect();
  }
 }
 return result;
 }

如果checkDownload方法中能够正确获得资源,方法返回参数code=1,ajax成功执行:window.location.href = RootPath()+"/todownload?url="+filePath+"&name="+fileName;   调用(todownload)方法,传入url和name,执行文件下载。

 @RequestMapping("/todownload")
 @ResponseBody
 public void download(String url, String name, HttpServletResponse response) {
 HttpURLConnection conn = null;
 try {
  File file = new File(url);
  // 取得文件的后缀名。
  String ext = file.getName().substring(file.getName().lastIndexOf(".") + 1).toLowerCase();
  StringBuffer buffername = new StringBuffer(name);
  String filename = buffername.append(".").append(ext).toString();
 
  URL path = new URL(url);
  conn = (HttpURLConnection) path.openConnection();
  conn.setRequestMethod("GET");
  conn.setConnectTimeout(5 * 1000);
  InputStream fis = conn.getInputStream();// 通过输入流获取数据
 
  byte[] buffer = readInputStream(fis);
  if (null != buffer && buffer.length > 0) {
  // 清空response
  response.reset();
  // 设置response的Header
  response.addHeader("Content-Disposition","attachment;filename="+ new String((filename).getBytes("GBK"),"ISO8859_1"));
  response.addHeader("Content-Length", "" + buffer.length);
  OutputStream toClient = response.getOutputStream();
  response.setContentType("application/octet-stream");
  toClient.write(buffer);
  toClient.flush();
  toClient.close();
  }
 
 } catch (IOException ex) {
  ex.printStackTrace();
 }finally {
  if(conn != null) {
  conn.disconnect();
  }
 }
 }
 
  /** 
   * 从输入流中获取数据 
   * @param inStream 输入流 
   * @return 
   * @throws Exception 
   */ 
 private byte[] readInputStream(InputStream fis) throws IOException {
  ByteArrayOutputStream outStream = new ByteArrayOutputStream(); 
     byte[] buffer = new byte[1024]; 
     int len = 0; 
     while( (len=fis.read(buffer)) != -1 ){ 
       outStream.write(buffer, 0, len); 
     } 
     fis.close(); 
     return outStream.toByteArray();
 }

PS:Spring MVC 文件流形式下载(返回)视频文件

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;

/**
 * 文件流形式下载视频
 * @author Front Ng
 * @date 2019-05-23 09:25
 **/

@Controller
@RequestMapping(value = "/download")
@Api(value = "下载", tags = "下载")
public class DownloadController {


  @ApiOperation(value = "下载视频")
  @RequestMapping(method = RequestMethod.GET)
  public void download(HttpServletResponse response) throws IOException {

    File file = new File("/Users/front/Downloads/123.mp4");

    FileInputStream inputStream = new FileInputStream(file);
    byte[] data = new byte[(int) file.length()];
    int length = inputStream.read(data);
    inputStream.close();

    String fileName = URLEncoder.encode("文件流形式视频.mp4", "UTF-8");

    response.setContentType("application/octet-stream;charset=UTF-8");
    response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
    response.addHeader("Content-Length", "" + data.length);

    OutputStream stream = response.getOutputStream();
    stream.write(data);
    stream.flush();
    stream.close();
  }
}

以上就是怎么在Spring Mvc中以文件流方式下载文件,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI