有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java AWS签名的URL在除Android之外的任何地方都可以使用

我正在使用AWS Lambda为我的移动产品创建一个简单的上传服务

在服务器上,我使用以下代码生成一个预先签名的URL

var params = {
    Bucket: targetS3Bucket,
    Key: key,
    Body: '',
    ContentType: event.contentType,
    Expires: 60
};

s3.getSignedUrl('putObject', params, function (err, url){
    context.done(null, {
        'oneTimeUploadUrl': url,
        'resultUrl': urlPrefix + key
    });
});

其中targetS3Bucket是S3上文件夹的路径,key是文件本身的名称,urlPrefix是S3上文件的HTTP位置的根(即:s3.amazonaws.com/some-folder/

将此代码与内置HTTP库一起使用(,也就是说,不使用任何aws SDK)在PC和iOS上都可以正常工作,但在Android上则不行

最新版本的Android客户端代码如下所示:

uri = new URL(oneTimeUploadUrl);

// Setup Connection
HttpsURLConnection http = (HttpsURLConnection) uri.openConnection();
http.setDoOutput(true);
http.setRequestMethod("PUT");
​
// Write Data
OutputStream os = http.getOutputStream();
os.write(_bytes);
os.flush();
os.close(); // request gets sent off to the server

这在代码400中始终失败。我尝试过几种方法,比如更改编码、使用非https版本的HttpsURLConnection和其他一些方法,但都没有效果

我更愿意避免引入AWS SDK,因为我只需要这一个函数就可以工作,而使用这个lambada端解决方案使除了安卓之外的所有平台都可以实现这一点

以下是从AWS返回的XML。返回的消息令人困惑,因为客户端从不更改令牌,而且同一过程在其他设备上成功

<?xml version="1.0" encoding="UTF-8"?>
<Error>
    <Code>InvalidToken</Code>
    <Message>The provided token is malformed or otherwise invalid.</Message>
    <Token-0>{Token-0}</Token-0>
    <RequestId>{RequestId}</RequestId>
    <HostId>{HostId}</HostId>
</Error>

共 (1) 个答案

  1. # 1 楼答案

    问题是HttpURLConnection会悄悄地将Content-Type: application/x-www-form-urlencoded添加到请求中。这很烦人,因为很难确定HttpURLConnection对象的请求中包含哪些头

    不管怎样。这是正确的代码

    uri = new URL(oneTimeUploadUrl);
    
    // Setup Connection
    HttpsURLConnection http = (HttpsURLConnection) uri.openConnection();
    http.setDoOutput(true);
    http.setRequestMethod("PUT");
    http.setRequestProperty("Content-Type"," "); // remove Content-Type header
    
    // Write Data
    OutputStream os = http.getOutputStream();
    os.write(_bytes);
    os.flush();
    os.close(); // request gets sent off to the server
    

    另见:HttpURLConnection PUT to Google Cloud Storage giving error 403