天天看點

SpringBoot下載下傳阿裡雲OSS檔案失敗,檔案無法打開?

起因:項目中使用Oss存儲,有上傳就有下載下傳。在下載下傳這裡遇到一個小坑,也是奇葩的很久才跳出來!!!

 先告訴你答案,換測試工具就好,不要走swagger測試。因為你會發現檔案是損壞的,無法打開。

項目中內建Swagger,用來接口調試,确實是比較友善啊,問題就出來這,也是也應該一開始就想到,當時同時下載下傳到本地檔案夾和附件檔案中,本地項目中檔案是可以打開的,而附件中的檔案大了一倍,走完接口,還需要在swg頁面點下連結,才會以附件格式下載下傳。

SpringBoot下載下傳阿裡雲OSS檔案失敗,檔案無法打開?
SpringBoot下載下傳阿裡雲OSS檔案失敗,檔案無法打開?

這裡也附上一下下載下傳代碼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!!!

繼續閱讀