上传文件
/**
* 上传文件
*
* @param files
* @return 文件地址
* @throws Exception
*/
@PostMapping(value = "upload", name = "上传文件")
public Result uploadImport(@Validated({ICRUDController.ISaveGroup.class}) FileUploadVo fileUploadVo, MultipartFile[] files) {
// 检查上传目录
File directory = new File(uploadFileLocation);
if (!directory.exists()) {
if (!directory.mkdirs()) {
throw new RFException(StatusCodeEnum.FAILED_CREATE_DIR, ObjectCode.UPLOADDIR);
}
}
// 对要保存的文件名进行处理
String[] spFileNames = new String[]{};
if (StringUtils.hasText(fileUploadVo.getFileNames())) {
spFileNames = fileUploadVo.getFileNames().split(",");
}
List<FileInfo> fileInfoList = new ArrayList<>();
int index = 0;
for (MultipartFile file : files) {
String filename = StrUtils.shortUUID();
File localFile = new File(uploadFileLocation, filename);
try {
file.transferTo(localFile);
log.info(localFile.getPath());
} catch (IOException e) {
e.printStackTrace();
}
FileInfo fileInfo = new FileInfo();
fileInfo.setPk(StrUtils.shortUUID()).setProjPk(fileUploadVo.getProjectPk()).setNodePk(fileUploadVo.getNodePk()).setFileSuffix("." + FilenameUtils.getExtension(file.getOriginalFilename())).setFileUrl(filename).setCreateDate(new Date()).setUploaderPk(obtainLoginerInfo().getUserId()).setEffectStatus(IPublicStatus.EffectStatus.ENABLED.value()).setRecordStatus(IPublicStatus.RecordStatus.CREATED.value());
if (index < spFileNames.length) {
fileInfo.setFileName(spFileNames[index]);
} else {
fileInfo.setFileName(FilenameUtils.getBaseName(file.getOriginalFilename()));
}
// 根据文件名后缀判断文件类型
try {
if (null != ImageIO.read(localFile)) {
fileInfo.setFileType(FileInfo.FileType.IMAGEFILE.value());
} else {
fileInfo.setFileType(FileInfo.FileType.DOCFILE.value());
}
} catch (IOException ex) {
fileInfo.setFileType(FileInfo.FileType.DOCFILE.value());
}
fileInfoList.add(fileInfo);
index++;
}
// 保存文件信息
int[] count = Db.batchSave(fileInfoList, fileInfoList.size());
Boolean flag = count.length > 0 ? true : false;
return Result.builder().success(true).data(flag).build();
}
下载文件
/**
* 浏览器下载文件
* @param model
*/
@GetMapping(value = "download", name = "下载文件")
public void download(@Validated({ICRUDController.IDownloadAndPreView.class}) FileInfoVo model) {
FileInfo fileInfo = FileInfo.dao.findById(model.getFilePk());
if (null == fileInfo) {
throw new RFException(StatusCodeEnum.EXCEPTION_OBJECT_NOTEXIST, ObjectCode.FILE);
}
try {
//下载文件的路径
String path = uploadFileLocation + File.separator + fileInfo.getFileUrl();
File file = new File(path);
if(file.exists()){
String filename = fileInfo.getFileName() + fileInfo.getFileSuffix();
//将文件写入输入流
FileInputStream fileInputStream = new FileInputStream(file);
InputStream fis = new BufferedInputStream(fileInputStream);
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
// 清空response
response.reset();
// 设置response的Header
response.setCharacterEncoding("UTF-8");
//Content-Disposition的作用:告知浏览器以何种方式显示响应返回的文件,用浏览器打开还是以附件的形式下载到本地保存
//attachment表示以附件方式下载 inline表示在线打开 "Content-Disposition: inline; filename=文件名.mp3"
// filename表示文件的默认名称,因为网络传输只支持URL编码的相关支付,因此需要将文件名URL编码后进行传输,前端收到后需要反编码才能获取到真正的名称
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
// 告知浏览器文件的大小
response.addHeader("Content-Length", "" + file.length());
OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
outputStream.write(buffer);
outputStream.flush();
}else{
//如果文件未找到则返回状态码404
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
预览文件视图
/**
* 预览文件视图
* @param model
*/
@GetMapping(value = "preview", name = "预览文件")
public void preView(@Validated({ICRUDController.IDownloadAndPreView.class}) FileInfoVo model){
FileInfo fileInfo = FileInfo.dao.findById(model.getFilePk());
if (null == fileInfo) {
throw new RFException(StatusCodeEnum.EXCEPTION_OBJECT_NOTEXIST, ObjectCode.FILE);
}
try {
//预览文件的路径
String path = uploadFileLocation + File.separator + fileInfo.getFileUrl();
File file = new File(path);
FileInputStream fis = new FileInputStream(file);
//将文件写入输出流
ServletOutputStream os = response.getOutputStream();
byte [] b = new byte[1024*8];
while(fis.read(b)!=-1){
os.write(b);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}