fastdfs上传后,文件名会进行更改,变成乱码。并不能是原名。
本来浏览器直接a标签绑url(ip+path),就能下载下来文件,但是文件名字嫌难看。
上传的文件有各种格式:zip,pdf,doc,jpg…
看了一下项目里已有的FileClientUtils等方法,并不带可以重命名的入参。只能自己写了
本想java io流里读取远程文件,response里setContentType,文件格式太多了,太蛋疼了,吐了。而且弄完了,前端点下载屁反应没有,不懂。遂,换思路,不在java里变成原格式了。
目前处理:
上传fastdfs时,返回rul和原名,存表。
java只是读取文件,返回二进制。
二进制重新转换为doc还是pdf等等,由前端处理(重命名为带格式后缀的原名即可,这也太简单了)
后端:
@SysLog("下载")
@RequestMapping("/download")
public ResponseEntity<byte[]> downloadFile(HttpServletRequest request, HttpServletResponse response, @RequestParam Map<String, Object> params) throws Exception {
String id = (String) params.get("id");
OaInformFileEntity oaInformFile = oaInformFileService.selectById(id);
String fileName = oaInformFile.getInformFileName();
String fileUrl = oaInformFile.getInformFileUrl();
// if (!StringUtils.isEmpty(id)) {
String url = fileUrl;
HttpHeaders headers = new HttpHeaders();
//处理IE
String userAgent = request.getHeader("user-agent").toLowerCase();
if (userAgent.contains("msie") || userAgent.contains("like gecko") ||
userAgent.contains("Trident")) {
// win10 ie edge 浏览器 和其他系统的ie
// 可以不用在这里管文件名。懒得删了
fileName = URLEncoder.encode(fileName, "UTF-8");
//解决下载时,空格变加号
fileName = org.apache.commons.lang3.StringUtils.replace(fileName, "+", "%20");
} else {
// fe
fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");
//解决下载时,空格变加号
fileName = org.apache.commons.lang3.StringUtils.replace(fileName, "+", "%20");
}
//通知浏览器以attachment(下载方式)
headers.setContentDispositionFormData("attachment",fileName); //解决原始文件名中有中文出现乱码);
//application/octet-stream : 二进制流数据。后端不用再管pdf还是doc了,太爽了
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
return new ResponseEntity<byte[]>(IOUtils.toByteArray(getFileInputStream(url)),
headers, HttpStatus.CREATED);
}
public InputStream getFileInputStream(String urlString) {
InputStream is = null;
try {
// 构造URL
URL url = new URL(urlString);
// 打开连接
URLConnection con = url.openConnection();
// 输入流
is = con.getInputStream();
} catch (Exception e) {
e.printStackTrace();
}
return is;
}
前端:
download(row) {
this.$http({
url: this.$http.adornUrl('/o/i/download'),
method: 'get',
responseType: 'blob',
params: { id: row.id}
}).then(({ data }) => {
const url = window.URL.createObjectURL(data);
const a = document.createElement('a');
a.href = url;
// 带文件名的重命名,即可。如'爱党爱国.doc'
a.download = row.fileName;
document.body.appendChild(a);
a.click();
window.URL.revokeObjectURL(url);
})
},