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!!!

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