首页 > 编程 > Java > 正文

Spring Mvc下实现以文件流方式下载文件的方法示例

2019-11-26 09:00:27
字体:
来源:转载
供稿:网友

项目中需要对一个点击事件进行下载操作,同时通过点击事件,已经可以从jsp页面获取到需要访问的URL和下载的文件名(数据库获取,jsp页面显示)。点击事件JS如下:

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();  }}

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表