繁体   English   中英

使用 Java 通过 Google App Engine 将文件上传到 Google Cloud Storage:(没有这样的文件或目录)

[英]Uploading Files to Google Cloud Storage via Google App Engine using Java: (No such file or directory)

我正在使用 GAE 开发 Spring-MAVEN JAVA 项目(主要是 REST API 用于后端)。 我还使用 GCS(谷歌云存储)来存储一些图像和视频。 问题是当我在本地服务器(tomcat 8.0)中执行我的文件时,它可以完美运行并将文件上传到 GCS。

但是,当我将文件部署到 GAE 并执行时,它返回java.io.FileNotFoundException (No such file or directory) 错误 我猜 GAE 服务器无法从我的计算机中找到文件。

我已经尝试了很多事情,但我仍然没有找到正确的答案。

这些是我与问题相关的代码:

    @RestController
    @RequiredArgsConstructor
    public class GCSController {

    private final GCSService gcsService;

    @PostMapping("gcs/upload")
    public ResponseEntity localUploadToStorage(@RequestBody UploadReqDto uploadReqDto) throws IOException {
         BlobInfo fileFromGCS = gcsService.uploadFileToGCS(uploadReqDto);
         return ResponseEntity.ok(fileFromGCS.toString());
  }
 } 


    @Service
    @RequiredArgsConstructor
    public class GCSService {

     private final Storage storage;

     @SuppressWarnings("deprecation")
     public BlobInfo uploadFileToGCS(UploadReqDto uploadReqDto) throws IOException {


         BlobInfo blobInfo =storage.create(
                 BlobInfo.newBuilder(uploadReqDto.getBucketName(), uploadReqDto.getUploadFileName())
                         .setAcl(new ArrayList<>(Arrays.asList(Acl.of(Acl.User.ofAllAuthenticatedUsers(), Acl.Role.READER))))
                         .build(),
                 new FileInputStream(uploadReqDto.getLocalFileLocation()));

         return blobInfo;
     }

    }

UploadReqDto 为 bucketname、uploadFileName 和 localFilelocation 创建构造函数、getter。

这是我为 API 添加的 maven 依赖项:

    <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-gcp-starter-storage</artifactId>
<version>1.2.3.RELEASE</version>

您可以按照此示例将文件从本地存储上传到 GAE 标准 java(单击“代码示例”选项卡和“Java”),您可以在此文档中找到更多信息

考虑到在应用引擎标准中写入本地磁盘仅限于 /tmp

如果您在部署 App Engine 的代码上使用 C:/users/.. 之类的文件路径 Java 将无法找到它

我刚刚想出了一个解决方案,所以这是我对自己问题的回答:

通过对我的 Goolge Cloud Storage 存储桶使用签名的 url 来修复它。 我在这个问题上花了一周时间,并认为当您在 GAE 上运行项目时,没有正确的方法可以访问您自己的文件路径(如 C:/users/)。

猜猜这个谷歌文档(将对象上传到 GCS仅在您的项目在本地运行时才有用。所以我的问题的解决方案是为我的存储桶生成签名的 URL 并通过它访问存储桶。这是有用的链接: 如何为 GCS 创建签名的 url

感谢所有回答这个问题的人!

暂无
暂无

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

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