文件信息
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import java.io.InputStream;
@Data
public class FileInfo {
@ApiModelProperty("文件名")
private String filename;
@ApiModelProperty("文件流")
private InputStream inputStream;
}
工具类
import org.apache.http.protocol.HTTP;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import javax.servlet.http.HttpServletRequest;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
/**
* @author kelvins
* @date 2023-01-12 15:31
*/
public class FileUtil {
/**
* 将文件流传递给前端浏览器
*
* @param fileInfo 文件信息
* @param contentType 内容类型
* @param request 请求
* @return
* @throws Exception
*/
public static ResponseEntity<InputStreamResource> forwardWeb(FileInfo fileInfo, String contentType, HttpServletRequest request) throws Exception {
if (fileInfo != null && fileInfo.getInputStream() != null) {
String fileName = fileInfo.getFilename();
// firefox浏览器
if (request.getHeader(HTTP.USER_AGENT).toLowerCase().indexOf("firefox") > 0) {
fileName = new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);
} else {
fileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString());
}
fileName = fileName.replaceAll("\\+", "%20");
return ResponseEntity.ok()
.contentType(MediaType.parseMediaType(contentType))
.header("Content-Disposition", String.format("attachment;filename=%s", fileName))
.body(new InputStreamResource(fileInfo.getInputStream()));
} else {
return ResponseEntity.notFound().build();
}
}
}
如果定义的文件名有空格比如"node export data",那么导出后的文件名就会有加号,就像这样"node+export+data.xlsx"。要想去掉加号保留空格就单独给文件名设置一下
fileName = fileName.replaceAll(“\+”, “%20”);
contentType
Excel: application/ms-excel
PDF: application/pdf