繁体   English   中英

如何从 Google Cloud Storage 下载文件并在 Spring 控制器中返回它

[英]How to download a file from Google Cloud Storage and return it in Spring controller

我有一个 Spring Boot 应用程序。 用户可以登录我的应用程序并上传文件。 用户的所有文件都存储在 Google Cloud Storage 中。 现在,我希望用户能够下载他们的文件。 所以,我必须从云存储下载文件。 我不知道我的控制器应该是什么样子。 使用我当前的代码,我得到了一个空文件。 上传已经完成,连接也很好。

public static Blob downloadFile(Storage storage, String fileName){
        Blob blob = storage.get(BUCKET_NAME, fileName);
        return blob;
    }

@RequestMapping(value = "/downloadFileTest")
    @ResponseBody
    public void downloadFile(HttpSession session,
            HttpServletResponse response) {
        Storage storage = de.msm.msmcenter.service.cloudstorage.Authentication.getStorage();
        Blob blob = de.msm.msmcenter.service.cloudstorage.Authentication.downloadFile(storage,"test.txt");
        ReadChannel readChannel = blob.reader();
        InputStream inputStream = Channels.newInputStream(readChannel);
        try {
            response.setContentType("application/force-download");
            response.setHeader("Content-Disposition", "attachment; filename=test.txt");
            IOUtils.copy(inputStream, response.getOutputStream());
            response.flushBuffer();
            inputStream.close();
        } catch (Exception e){
            e.printStackTrace();
        }

    }

我实际上希望能够下载任何文件,而不仅仅是 txt。 当用户打开链接时,名为 test.txt 的文件被下载,但它是空的。

似乎您只想授予用户访问权限以能够下载文件。

一种解决方案是使用Signed URL ,它可以让您在有限的时间内为用户提供URL以访问/下载对象。 如果直接将用户重定向到该URL,则下载将立即开始。

谢谢@Mayeru,我将代码更改为:

public static String downloadFile(Storage storage, String fileName){
        Blob blob = storage.get(BUCKET_NAME, fileName);
        String PATH_TO_JSON_KEY = "/your/path";
        URL signedUrl = null;
        try {
            signedUrl = storage.signUrl(BlobInfo.newBuilder(BUCKET_NAME, fileName).build(),
                    1, TimeUnit.DAYS, SignUrlOption.signWith(ServiceAccountCredentials.fromStream(
                            new FileInputStream(PATH_TO_JSON_KEY))));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return signedUrl.toString();
    }

//将此行添加到您 spring-boot application.properties 文件 spring.cloud.gcp.credentials.location=classpath:key.json

    // read/download objects
public static ResponseEntity<byte[]> getObjectFromGCP(String yourfileName) throws IOException {
    String objectNameWithLocation ="your file location with file name in GCP bucket";
     //create your storage object with your credentials
    
    Credentials credentials = GoogleCredentials.fromStream(new 
       ClassPathResource("key.json").getInputStream());
    Storage storage = StorageOptions.newBuilder().setCredentials(credentials).build().getService();
    BlobId blobId = BlobId.of(bucketName, objectNameWithLocation);
    Blob blob = storage.get(blobId);
    return ResponseEntity.ok().contentType(MediaType.valueOf(FileTypeMap.getDefaultFileTypeMap().getContentType(yourfileName)))
            .body(blob.getContent(BlobSourceOption.generationMatch()));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM