Java Blob已创建,但未使用SignedURL上载文件
我使用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
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;