设置Content-Disposition响应头类型
"inline"查看预览 ; "attachment"下载;
inline:表示回复中的消息体会以页面的一部分或者整个页面的形式展示
attchment:以附件形式被下载到本地;
xml
/**
* 文件或图片预览/下载工具类
* @author zh、
* @data 2024/1/11 18:35
*/
@Component
@Slf4j
public class FileHttpUtil {
/**
* 根据物理路径文件 获取 下载/预览 文件
* @param file 文件
* @param type 设置响应头类型 "inline"查看 "attachment"下载
* @param fileName 文件名
* @return 对应类型响应文件
*/
public static ResponseEntity<?> getResponseEntity(byte[] file , String type , String fileName ){
ResponseEntity.BodyBuilder responseEntity = ResponseEntity.ok();
HttpHeaders httpHeaders = new HttpHeaders();
Tika tika = new Tika();
String mediaType = tika.detect(file);
httpHeaders.setContentType(MediaType.parseMediaType(mediaType));
httpHeaders.setContentDisposition(ContentDisposition.builder(type)
.filename(URLEncoder.encode(fileName )).build());
httpHeaders.setCacheControl(CacheControl.noCache());
//httpHeaders.setCacheControl(CacheControl.maxAge(10, TimeUnit.MINUTES));
return responseEntity.headers(httpHeaders).body(file );
}
需要的pom依赖文件
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>1.28.4</version>
</dependency>
接口调用或测试
xml
/**
* 查询文件
* @param filePath文件地址 物理路径
* @param type 设置响应头类型 "inline"查看 "attachment"下载
* @return 响应文件
* @throws IOException
*/
@GetMapping(value = "/file")
public ResponseEntity<?> file(String filePath,String type){
//根据文件路径去文件服务获取文件
File file = new File(filePath);
try (FileInputStream fileInputStream = new FileInputStream(file)) {
byte[] buf = new byte[fileInputStream.available()];
fileInputStream.read(buf);
return FileHttpUtil.getResponseEntity(buf, type,file .getName());
} catch (IOException e) {
e.printStackTrace();
}
}