用这篇文章来介绍一种Java文件上传和下载的方法。可以将上传的文件保存到本地磁盘或者服务器,同时,可再从此路径将文件下载,前面不过多介绍了,一些解释都在代码注释里。
/**
* 上传
* @param file file
* @param taskId taskId
* @return String
*/
public String fileUpload(MultipartFile file, String taskId) {
Long checkTaskId = Long.parseLong(taskId);
String originalFilename;
if (file.isEmpty()) {
return "文件不存在";
} else {
//获取文件名称,包含格式(fileName.pdf)
originalFilename = file.getOriginalFilename();
//如有必要将文件上传至数据库(我的业务中文件与某个操作关联
//所以在插入之前应该判断数据库中是否已存在)
//判断数据库中该操作下的该文件是否已存在(代码略)
fileTaskDao.insertFileOfTask(originalFilename, checkTaskId);
log.info("# originalFilename=[{}] , name=[{}] , size=[{}] , contentType=[{}] ", originalFilename, file.getName(), file.getSize(), file.getContentType());
try {
if(StringUtils.isNotEmpty(originalFilename)){
//创建文件夹,filePath是文件保存路径,我是写在配置文件里,用@Value注进来
File fileDir = new File(filePath);
if(!fileDir.exists()){
boolean mkdir = fileDir.mkdir();
if (!mkdir){
log.info("fileDir 文件夹创建失败");
return Result.fail(ResultType.FAIL.getCode(), "文件上传失败");
}
}
//用apache.commons.io.FileUtils类的方法copyInputStreamToFile
//拷贝一个字节流到一个文件中,如果这个文件不存在则创建,存在将被重写进内容
FileUtils.copyInputStreamToFile(file.getInputStream(), new File(fileRealPath, originalFilename));
}
} catch (IOException e) {
e.printStackTrace();
return Result.fail(ResultType.FAIL.getCode(), "文件上传失败");
}
}
return Result.success(ResultType.SUCCESS.getCode(), "文件上传成功");
}
/**
* 下载
* @param checkTaskId checkTaskId
* @param fileName fileName
* @return ResponseEntity<byte[]>
*/
public ResponseEntity<byte[]> downloadFile(String fileName, String checkTaskId) throws IOException {
//文件下载路径,这个路径在上面说了,注意要加文件名
String Path = filePath + fileName;
log.info("# download Path=[{}]", Path);
File file = new File(Path);
HttpHeaders headers = new HttpHeaders();
//application/octet-stream属于HTTP规范中Content-Type的一种,其只能提交二进制
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setContentDispositionFormData("attachment", new String(file.getName().getBytes(StandardCharsets.UTF_8), "ISO8859-1"));
//readFileToByteArray 把一个文件转换成字节数组返回
return new ResponseEntity<>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED);
//页面直接弹出下载框,就结束咯
}
如果遇到上传文件过大报错的问题,请看 解决文件上传时文件过大问题
点关注 不迷路,一起解决更多问题,微信公众号:非定义式程序员