我有一个Java-Python集成问题,我从Python Lambda收到一个预签名的URL, Java桌面客户端实际上正在使用该URL执行多部分上传。
我面临的问题的本质是Python和Java使用预先指定的URL的方式是完全不同的。Python使用像
这样的JSON对象{"url":"https://some-bucket-us-west-2.s3.amazonaws.com/","fields":{"key":"my_object_key","AWSAccessKeyId":"XXXXXXXXXXX","x-amz-security-token":"my_token","policy":"my_policy","signature":"my_sig"}}
预签名URL在Python中的示例用法:
requests.post(returned_url_response['url'], data=returned_url_response['fields'], files=files)
然而,Java使用了一个实际的URL,它以某种方式被参数化/编码:
https://my桶-我们-西方- 2. - 2. s3.us -西方- amazonaws.com/caseid%3d02_mock/dummy.encrypted?x湄京- algorithm=aws4 hmac - sha256& X-Amz-Date = 20210924 t184139z& X-Amz-SignedHeaders = host& X-Amz-Expires = 3599, X-Amz-Credential = some_credentialFaws4_request& X-Amz-Signature = some_hash
Java中预签名URL的示例用法:
URL url = s3Client.generatePresignedUrl(generatePresignedUrlRequest);
// Create the connection and use it to upload the new object using the pre-signed URL.
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setRequestMethod("PUT");
OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream())
我的问题是,如果有一个Java等效做我在Python做什么,这样我仍然可以使用Python生成的输出?
或者在Python lambda中使用generate_presigned_url()
生成我可以从Java应用程序使用的URL吗?我是否需要为每个ClientMethod操作create_multipart_upload, upload_part, complete_multipart_upload
生成一个预签名的URL ?
最后,这两种方法中的任何一种都比扔掉我的Python Lambda并制作一个生成预签名URL的Java Lambda更好吗?
Python还可以为任何HTTP方法生成一个一体化编码的URL,因为这是预签名URL的默认形式。我创建了一个测试python脚本,以确保一切正常工作。如果运行此命令(在导出凭据并用适当的桶/对象密钥替换变量之后),您将得到一个编码的URL输出到控制台:
import boto3
s3 = boto3.client('s3')
url = s3.generate_presigned_url('put_object', Params={'Bucket': bucket, 'Key': object_key},
ExpiresIn=expirationInSeconds,
HttpMethod=method)
print(url)
很可能你正在使用generate_presigned_post
,它返回一个字典而不是你的python lambda的URL,然而,使用generate_presigned_url
的post操作将工作良好,只要你确保你在正确的HttpMethod中传递。(引用)