PDF下载PostMan测试结果是这样的:
直接把请求路径在浏览器上测试就可以出效果。
Java代码
package com.sinosoft.ie.controller;
import com.sinosoft.ie.model.ItemFiles;
import com.sinosoft.ie.service.ItemFilesService;
import com.sinosoft.ie.util.IdUtils;
import com.sinosoft.ie.util.ResponseMessage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
/**
* @Author 庭前云落
* @Date 2021/3/4 9:41
* @Description
*/
@Slf4j
@RestController
@RequestMapping("/ItemFilesController")
public class ItemFilesController {
@Resource
private ItemFilesService itemFilesService;
@Value("D:/")
private String UPLOADED_FOLDER;
@GetMapping("/download.do")
public ResponseMessage downloadFile(@RequestParam("fileId") String fileId, HttpServletResponse response) throws UnsupportedEncodingException {
//根据ID查出对应文件的文件名
ItemFiles itemFiles = itemFilesService.selectOneByFileId(fileId);
String fileName = itemFiles.getName();
if (fileName != null) {
if (fileName.contains("/") || fileName.contains("\\")) {
return null;
}
File file = new File(UPLOADED_FOLDER, fileName);
if (file.exists()) {
response.setContentType("application/force-download");// 设置强制下载不打开
response.addHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName, "UTF-8"));// 设置文件名
byte[] buffer = new byte[1024];
FileInputStream fis = null;
BufferedInputStream bis = null;
try {
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
OutputStream os = response.getOutputStream();
int i = bis.read(buffer);
while (i != -1) {
os.write(buffer, 0, i);
i = bis.read(buffer);
}
System.out.println("success");
} catch (Exception e) {
e.printStackTrace();
} finally {
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
return null;
}
@PostMapping("/upload.do")
public ResponseMessage singleFileUpload(@RequestParam("file") MultipartFile file,HttpServletRequest request) {
//往数据库里面存的数据
Integer intId = IdUtils.getIntId();
String itemId = request.getHeader("itemId");
String userId = request.getHeader("userId");
String originalFileName = file.getOriginalFilename().toString();
if (!file.getName().matches("^.+\\.(?i)(pdf)$") && !file.getName().matches("^.+\\.(?i)(PDF)$") &&
!originalFileName.matches("^.+\\.(?i)(pdf)$") && !originalFileName.matches("^.+\\.(?i)(PDF)$")
) {
return null;
}
try {
byte[] bytes = file.getBytes();
if (file.getName() == null) {
originalFileName = new String(file.getName().getBytes(), "UTF-8");
}
//要求上传的PDF文件名不重复,所以设置成随机的ID
String filePath = UPLOADED_FOLDER + File.separator + String.valueOf(intId)+".pdf";
File dest = new File(filePath);
if (!dest.getParentFile().exists()) { //判断文件父目录是否存在
dest.getParentFile().mkdir();
}
Path path = Paths.get(filePath);
Files.write(path, bytes);
//相关数据保存到数据库
itemFilesService.add(String.valueOf(intId),originalFileName,itemId,userId);
return ResponseMessage.createSucResponseMessage("PDF文件上传成功");
} catch (Exception e) {
log.error("PDF上传文件异常",e);
return ResponseMessage.createErrResponseMessage("PDF上传文件失败");
}
}
}