一个恶心的坑记录下。
刚开始不知道阿里云可以通过直接设置下载文件名,所以从网上查到链接
- https://blog.csdn.net/weixin_45861283/article/details/111597661
所以写了一个获取链接然后下载的代码:
@RequestMapping(value = "/downloadAttac", method = RequestMethod.GET, produces = "application/octet-stream")
public void download(String url, String fileName, HttpServletRequest request, HttpServletResponse response) {
if (!url.startsWith("http")) {
url = "http:".concat(url);
}
fileName = URLUtil.decode(fileName);
// 下载本地的文件
try {
// 把文件从第三方服务器下载到当前服务器本地
URL url2 = new URL(url);
URLConnection conn = url2.openConnection();
InputStream inputStream = conn.getInputStream();
response.reset();
response.setContentType(conn.getContentType());
OutputStream os = response.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(os);
try {
BufferedInputStream bis = new BufferedInputStream(inputStream);
try {
response.setContentType("application/x-msdownload");
response.setHeader("Content-Disposition",
"attachment; filename="
+ URLEncoder.encode(fileName, "UTF-8"));
byte[] read = new byte[1024];
while (bis.read(read) != -1) {
bos.write(read);
}
bos.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
bis.close();
inputStream.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
bos.close();
os.close();
}
} catch (Exception e) {
e.printStackTrace();
}
但是发现下载下来的文件是乱码。看了下代码,才发现是read和write方法写错了,因为是同时从网络上获取,每次不会取满1024字节,所以每次都有些空字节传进去,就会有问题。改成这样就好了:
int len = 0;
while ((len = bis.read(read)) != -1) {
bos.write(read, 0, len);
}
后来才发现,阿里云在上传的时候,可以设置下载的名称,就不用这么转折的方法了,添加下面的代码即可
let _self = this;
_self.dataObj['Content-Disposition'] = "attachment;filename=" + file.name;