Java Blob已创建,但未使用SignedURL上载文件

Java Blob已创建,但未使用SignedURL上载文件,java,google-app-engine,google-cloud-platform,google-cloud-storage,Java,Google App Engine,Google Cloud Platform,Google Cloud Storage,我使用SignedURL将文件直接上传到云存储,而无需通过应用程序引擎实例。我遵循的过程是: 创建空对象并为该对象生成SignedURL Storage storage = null; try{ FileInputStream credentialsStream = new FileInputStream("JSONFile"); Credentials credentials = GoogleCredentials.fromStream(credentialsStream); stor

我使用SignedURL将文件直接上传到云存储,而无需通过应用程序引擎实例。我遵循的过程是:

  • 创建空对象并为该对象生成SignedURL

    Storage storage = null;
    
    try{
    
    FileInputStream credentialsStream = new FileInputStream("JSONFile");
    
    Credentials credentials = GoogleCredentials.fromStream(credentialsStream);
    
    storage = StorageOptions.newBuilder().setCredentials(credentials).build().getService();
    
    }catch(IOException e) {
    
      e.printStackTrace();
    
    }
    
    Acl aclObject = Acl.of(User.ofAllUsers(),Role.OWNER);
    
    List<Acl> aclAccess = new ArrayList<>();
    
    aclAccess.add(aclObject);
    
    //BucketName and User name are Strings.
    BlobId blobId = BlobId.of(BUCKET_NAME,USER_NAME+"TeamLogo");
    
    BlobInfo blobInfo = BlobInfo.newBuilder(blobId).setAcl(aclAccess).setContentType("image/jpeg").build();
    
    Blob blob = storage.create(blobInfo); 
    
    我的HTML代码来处理文件的上传

    
    输入您的用户名


    输入您的团队名称


    上传团队徽标



    看起来您正在尝试使用该命令,但正在使用该命令。例如,您正在使用
    success\u action\u redirect
    ,这只是POST-object命令的一部分。PUT Object命令不接受这种形式的表单数据

    可以将PUT object命令与签名URL一起使用,但不能以这种方式使用。相反,您可以使用JavaScript来手工上传文件内容

    如果您计划使用HTML表单,那么POST对象命令就是您想要的命令。不过,签署这些请求的规则有点不同。查看文档的“政策文档”部分:


    因此,要更改上面的示例,请将方法切换到
    POST
    ,添加一个
    策略
    字段和一个
    签名
    字段,该字段由服务器以与您现在对请求签名相同的方式创建,并将操作切换到“”。

    嗨,Brandon,感谢您的回复。正如您所建议的,我编写了一个Javascript函数来将文件上传到云存储,但当我向服务器端生成的signedURL发出PUT请求时,GCS发出了404错误。这给我留下了一个问题。我们真的需要签名吗?或者我可以直接使用
    https://storage.googleapis.com/[BUCKET\u NAME]/[OBJECT\u NAME]
    如本文所述,我已经编辑了这个问题,并在代码中添加了Javascript函数
        HttpMethod httpMethod = HttpMethod.PUT;
    
        ServiceAccountSigner signer = ServiceAccountCredentials.newBuilder().setClientId(CLIENT_ID).setClientEmail(CLIENT_EMAIL).setPrivateKey(PRIVATEKEY).setPrivateKeyId(PRIVATE_KEY_ID).build()
    
        URL url = blob.signUrl(10,TimeUnit.MINUTES,Storage.SignUrlOption.httpMethod(httpMethod),Storage.SignUrlOption.signWith(signer),Storage.SignUrlOption.withContentType());
        return url;