@RequestMapping(value = "/file/download", produces = { "application/octet-stream" }, method = RequestMethod.GET) public String download(@RequestParam(value = "name", required = true) String name,HttpServletResponse response)throws Exception { BufferedInputStream bufferedFileInputStream = null; ServletOutputStream outputStream = null; try { File file = new File(DocServiceImpl.path + File.separator + name); String encodedFileName = URLEncoder.encode(name, "UTF-8"); response.setHeader("content-disposition", "attachment; filename=" + encodedFileName); response.setContentType("application/octet-stream"); response.setContentLength((int) file.length()); response.setCharacterEncoding("utf-8"); bufferedFileInputStream = new BufferedInputStream(new FileInputStream(file)); int len = 0; byte[] buffer = new byte[2048]; outputStream = response.getOutputStream(); while ((len = bufferedFileInputStream.read(buffer)) > 0) { outputStream.write(buffer, 0, len); }}catch (IOException e) { e.printStackTrace(); }finally { // 5、try中打开的流需要关闭、创建的临时文件需要删除 try { if (outputStream != null) outputStream.close(); } catch (Exception e) {} try { if (bufferedFileInputStream != null) bufferedFileInputStream.close(); } catch (Exception e) { } } return new Result(true,null,"成功").toString(); }}
时间: 2023-12-20 09:03:15 浏览: 109
这段代码是一个 Spring MVC 的 Controller,它的作用是提供文件下载功能。当请求 `/file/download?name=xxx` 时,它会读取服务器上名为 `xxx` 的文件,并将其作为响应的内容输出给客户端。
具体来说,它的实现步骤如下:
1. 根据文件名构建文件对象 `File file = new File(DocServiceImpl.path + File.separator + name);`,其中 `DocServiceImpl.path` 是文件所在目录的路径。
2. 对文件名进行 URL 编码 `String encodedFileName = URLEncoder.encode(name, "UTF-8");`,防止文件名中含有特殊字符导致的问题。
3. 设置响应头,指定文件名和类型:
```
response.setHeader("content-disposition", "attachment; filename=" + encodedFileName);
response.setContentType("application/octet-stream");
```
其中 `"content-disposition"` 指定了文件下载时的行为,`"attachment"` 表示要下载文件而不是在浏览器中打开它。`"filename"` 指定了下载文件的名称。`"application/octet-stream"` 表示下载的文件是二进制流形式的,没有指定具体的文件类型。
4. 读取文件内容,并将内容写入到响应流中:
```
bufferedFileInputStream = new BufferedInputStream(new FileInputStream(file));
int len = 0;
byte[] buffer = new byte[2048];
outputStream = response.getOutputStream();
while ((len = bufferedFileInputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, len);
}
```
这里使用 `BufferedInputStream` 和 `FileInputStream` 对文件内容进行读取,然后将读取的数据写入到响应流中。
5. 关闭流和删除临时文件:
```
try {
if (outputStream != null)
outputStream.close();
} catch (Exception e) {}
try {
if (bufferedFileInputStream != null)
bufferedFileInputStream.close();
} catch (Exception e) {}
```
在使用流操作后,需要将其关闭以释放资源。另外,如果在下载过程中创建了临时文件,还需要将其删除以释放磁盘空间。
阅读全文