>工具类。
之前的 [使用HttpClient通过Post请求发送MultipartFile文件](https://lixj.fun/archives/%E4%BD%BF%E7%94%A8httpclient%E9%80%9A%E8%BF%87post%E8%AF%B7%E6%B1%82%E5%8F%91%E9%80%81multipartfile%E6%96%87%E4%BB%B6) 做了上传的功能,今天发现文件同名时会被覆盖,决定在上传前修改文件名。记录做个工具类。。。。
被做个文件上传搞死,问题一个接一个。。。
```
private MultipartFile renameFile(MultipartFile multipartFile) throws Exception {
InputStream inputStream = null;
try {
String originalFilename = multipartFile.getOriginalFilename();
if (StringUtil.isEmpty(originalFilename)) {
throw new BizException(CosmosResultCodeEnum.BIZ_FAIL);
}
String prefix = originalFilename.substring(0, originalFilename.lastIndexOf("."));
prefix = prefix.length() < 3 ? prefix + "_file" : prefix;
String suffix = getSuffix(multipartFile);
// 临时文件
File file = File.createTempFile(prefix, "." + suffix);
multipartFile.transferTo(file);
String fileName = prefix + "_" + UUIDUtil.getTimeStamp() + "." + suffix;
// 重命名
file = FileUtil.rename(file, fileName, true, true);
inputStream = new FileInputStream(file);
// File转换成MultipartFile
multipartFile = new MockMultipartFile(fileName, fileName,
ContentType.APPLICATION_OCTET_STREAM.toString(), inputStream);
if (!file.delete()) {
throw new BizException(CosmosResultCodeEnum.BIZ_FAIL);
}
return multipartFile;
} catch (Exception e) {
throw new BizException(CosmosResultCodeEnum.BIZ_FAIL);
} finally {
if (inputStream != null) {
inputStream.close();
}
}
}
```
**2021-7-4 更新**
上周发现生成 MultipartFile 时 ContentType 指定为 application/octet-stream ,文件上传后,前端通过链接不能直接进行下载,比如访问 doc 文件,浏览器展示的是 xml(如下图)。访问链接时发现 ContentType 为 text/xml,经过一番验证,发现将 ContentType 改为 multipart/form-data 就能进行下载了。
```
MultipartFile multipartFile = new MockMultipartFile(fileName, fileName, "multipart/form-data", inputStream);
```
因为业务需要改为 multipart/form-data 了,有些场景可以用 application/octet-stream,比如上传的是图片,用 application/octet-stream 上传的会保留原文件的类型,上传后访问链接时可以进行预览而不是直接下载,而如果使用的是 multipart/form-data 了,上传后访问链接就是直接下载了。
当然了,这些只是浏览器的默认处理,我们也可以交给前端处理,如果处理不了,可以考虑在 Nginx 那里做代理。交给前端处理就比较灵活一些。

End.


MultipartFile重命名上传