SpringBoot下載阿里雲OSS文件失敗,文件無法打開?

起因:項目中使用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!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章