起因:項目中使用Oss存儲,有上傳就有下載。在下載這裏遇到一個小坑,也是奇葩的很久才跳出來!!!
先告訴你答案,換測試工具就好,不要走swagger測試。因爲你會發現文件是損壞的,無法打開。
項目中集成Swagger,用來接口調試,確實是比較方便啊,問題就出來這,也是也應該一開始就想到,當時同時下載到本地文件夾和附件文件中,本地項目中文件是可以打開的,而附件中的文件大了一倍,走完接口,還需要在swg頁面點下鏈接,纔會以附件格式下載。
這裏也附上一下下載代碼demo
if (!AliOssUtil.fileExist(key1[1])) { // 文件不存在
log.info("文件不存在");
return;
}
// 使用簽名URL進行臨時授權
// OSSObject ossObject = ossClient.getObject(bucketName, key1[1]);
OSSObject ossObject = downLoadImage(key1[1], ossClient);
try {
response.setContentType("application/octet-stream; charset=UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + new String(fileName.getBytes(), "ISO-8859-1"));
InputStream is = ossObject.getObjectContent();
OutputStream os = response.getOutputStream();
byte[] buffer = new byte[1024];
int lenght = 0;
while ((lenght = is.read(buffer)) != -1) {
os.write(buffer, 0, lenght);
}
os.flush();
os.close();
is.close();
ossClient.shutdown();
這裏說一下:fileName 是指你bucket下的文件全路徑名(包括文件名) ,比如你文件在bucket下的 project/img,fileName就是project/img+文件名
public static OSSObject downLoadImage(String fileName, OSS ossClient) throws UnsupportedEncodingException {
// url過期時間爲一小時 ms
Date expiration = new Date(new Date().getTime() + 3600 * 1000);
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, fileName, HttpMethod.GET);
request.setExpiration(expiration);// 設置過期時間。
// ResponseHeaderOverrides header = new ResponseHeaderOverrides();
// header.setContentDisposition("attachment;filename="+new String("fileName".getBytes(), "ISO-8859-1"));
// request.setResponseHeaders(header);
// 生成簽名URL(HTTP GET請求)。
URL signedUrl = ossClient.generatePresignedUrl(request);
log.info("url簽名{}", signedUrl);
OSSObject object = ossClient.getObject(signedUrl, new HashMap<>());
return object;
}
就這樣,所以 還是要多用測試工具! 有問題歡迎留言。
Ending!!!