2021SC@SDUSC
后台部分在前期主要完成与前端文件上传和下载的工作。
这部分记录对于处理完的视频提供的后台文件下载接口。
流程:
前端上传视频到后端 ——> 后端处理视频,处理完成的gif保存在一个文件夹,并给前端返回消息true 和 Gif数量 ——>前端收到true后,向后端发起下载请求,参数为原视频文件名
后台文件的下载接口按理说不难写,但是开始也走了一些弯路:
@RequestMapping(value = "/downFile")
public HttpServletResponse downloadFile(HttpServletResponse response,HttpServletRequest request) {
try {
String fileName = request.getParameter("name").toString();
// 要下载的文件的全路径名
String filePath ="D:\\test\\upload\\file\\"+fileName;
File file = new File(filePath);
// 获取文件名
String filename = file.getName().toString();
//通过流把文件内容写入到客户端
InputStream fis = new BufferedInputStream(new FileInputStream(filePath));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
// 清空response
response.reset();
// 设置response的Header
response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes(),"ISO-8859-1"));
response.addHeader("Content-Length", "" + file.length());
OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
toClient.write(buffer);
toClient.flush();
toClient.close();
} catch (IOException ex) {
ex.printStackTrace();
}
return response;
}
这段代码是我一开始写的,测试的时候图片是可以通过客户端提供的参数直接下载服务器资源,但是我们需要的是response中的文件流,这个代码就在这里出现问题:
后来查询资料,问题都在于:
产生这样的异常原因:是web容器生成的servlet代码中有 out.write(" "), 这个和JSP中调用的response.getOutputStream()产生冲突。即Servlet规范说明,不能既调用response.getOutputStream(),又调用response.getWriter(),无论先调用哪一个,在调用第二个时候应会抛出IllegalStateException,因为在jsp中,out变量实际上是通过response.getWriter得到的,你的程序中既用了response.getOutputStream,又用了out变量,故出现以上错误。
但是我的程序中并没有调用这两种,并且在调用之前我是进行了response.reset()操作,最后调试了一个下午实在找不到原因,又重新找了一个思路,代码如下:
@RequestMapping(value = "/downLoad")
public ResponseEntity download(HttpServletResponse response,HttpServletRequest request) throws IOException {
//获取文件路径
HttpHeaders headers = new HttpHeaders();//http头信息
//新建一个文件
String fileName = request.getParameter("name").toString();
System.out.println(fileName );
String filePath =System.getProperty("user.dir") + "/temp/upload/"+fileName;
File file = new File(filePath);
String downloadFileName = new String(fileName.getBytes(), "iso-8859-1");
//设置编码
headers.setContentDispositionFormData("attachment", downloadFileName);
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
System.out.println("下载完成");
return new ResponseEntity(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED);
}
这次比较顺利,我在浏览器直接访问接口,可以成功下载: