我们在做项目时经常会碰到需要实现文件的预览或下载,下面用SpringBoot简单实现一下。
1、预览文件
package com.example.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
/**
* @Description: txt文件预览
* @author: caihai
* @date: 2023年02月08日 9:45
*/
@RestController
@RequestMapping("/preview")
public class TxtFilePreview {
@Resource
HttpServletResponse response;
@Resource
HttpServletRequest request;
@GetMapping(value = "/file")
public void previewFile() throws Exception {
String path = "C:\\Users\\HP\\Desktop\\dict_test.txt";
File file = new File(path);
String fileName = file.getName();
response.setCharacterEncoding("UTF-8");
BufferedInputStream br = null;
OutputStream out = null;
if (file.exists()) {
try {
br = new BufferedInputStream(new FileInputStream(file));
byte[] buf = new byte[1024];
int len = 0;
response.reset();
String agent = request.getHeader("user-agent");
if (agent.contains("FireFox")) {
fileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1");
} else {
fileName = URLEncoder.encode(fileName, "UTF-8");
}
String mineType = request.getServletContext().getMimeType(fileName);
response.setContentType(mineType);
response.setHeader("Content-Disposition", "inline; filename=" + fileName); // 在线预览
// response.setHeader("Content-Disposition", "attachment; filename=" + fileName); // 下载
out = response.getOutputStream();
while ((len = br.read(buf)) > 0) {
out.write(buf, 0, len);
}
out.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
out.close();
}
if (br != null) {
br.close();
}
}
} else {
throw new Exception("文件不存在");
}
}
}
2、下载文件
下载文件跟预览文件时间上是一样的,仅仅是打开方式不太一样。
/**
* 文件下载
*
* @param request request
* @param response response
* @param fileName 文件名
* @param path 文件路径
*/
public static void downLoadFile(HttpServletRequest request, HttpServletResponse response, String fileName, String path) {
FileInputStream inputStream = null;
BufferedInputStream bufferedInputStream = null;
OutputStream outputStream = null;
try {
File file = new File(FilenameUtils.normalize(path));
if (file.exists()) {
String agent = request.getHeader("user-agent");
if (agent.contains("FireFox")) {
fileName = new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);
} else {
fileName = URLEncoder.encode(fileName, "UTF-8");
}
String mineType = request.getServletContext().getMimeType(fileName);
response.setContentType(mineType);
response.setHeader("content-type", "application/form-data");
response.setHeader("Content-disposition", "attachment; fileName=" + fileName);
inputStream = new FileInputStream(file);
bufferedInputStream = new BufferedInputStream(inputStream);
outputStream = response.getOutputStream();
int len = 0;
byte[] buff = new byte[1024];
while ((len = bufferedInputStream.read(buff)) != -1) {
outputStream.write(buff, 0, len);
}
} else {
throw new ValidateException("下载的文件资源不存在");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (inputStream != null) {
inputStream.close();
}
if (bufferedInputStream != null) {
bufferedInputStream.close();
}
if (outputStream != null) {
outputStream.flush();
outputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
3、设置头信息使浏览器预览或下载文件
强制浏览器下载
response.setHeader("Content-Disposition", "attachment; filename=" + fileName)
浏览器在线打开
response.setHeader("Content-Disposition", "inline; filename=" + fileName)