当前位置: 首页 > 知识库问答 >
问题:

如何使用预先签名的URL而不是凭据直接从浏览器上载到AWSS3?

澹台新知
2023-03-14

但是,没有关于如何完成这一点的例子。此外,如果没有设置凭据,即使在向S3请求上载之前,SDK也会出错

code: "CredentialsError"
message: "No credentials to load"

JS SDK文档中提到了这一点,因此似乎有可能:

Pre-signing a putObject (asynchronously)
var params = {Bucket: 'bucket', Key: 'key'};
    s3.getSignedUrl('putObject', params, function (err, url) {
      console.log('The URL is', url);
});

共有1个答案

宗政松
2023-03-14

别再提这个老问题了,但它确实帮了我一把,终于把它搞定了。我的解决方案基于PHP和JavaScript以及jQuery。

我在https://github.com/joernberkefeld/s3signedupload上很好地包装了整个解决方案,但以下是要点:

api.php

<?php
require_once '/server/path/to/aws-autoloader.php';
use Aws\Common\Aws;

$BUCKET = "my-bucket";
$CONFIG = "path-to-iam-credentials-file-relative-to-root.php"

function getSignedUrl($filename, $mime) {
    $S3 = Aws::factory( $CONFIG )->get('S3');
    if(!$filename) {
        return $this->error('filename missing');
    }
    if(!$mime) {
        return $this->error('mime-type missing');
    }
    $final_filename = $this->get_file_name($filename);
    try {
        $signedUrl = $S3->getCommand('PutObject', array(
            'Bucket' => $BUCKET,
            'Key' => $this->folder . $final_filename,
            'ContentType' => $mime,
            'Body'        => '',
            'ContentMD5'  => false
        ))->createPresignedUrl('+30 minutes');
    } catch (S3Exception $e) {
        echo $e->getMessage() . "\n";
    }
    $signedUrl .= '&Content-Type='.urlencode($mime);
    return $signedUrl;
}


echo getSignedUrl($_GET['filename'],$_GET['mimetype']);
<?php
return array(
    'includes' => array('_aws'),
    'services' => array(
        'default_settings' => array(
            'params' => array(
                'key'    => 'MY-ACCESS-KEY',
                'secret' => 'MY-SECRECT',
                'region'  => 'eu-west-1' // set to your region
            )
        )
    )
);
$("input[type=file]").onchange = function () {
    for (var file, i = 0; i < this.files.length; i++) {
        file = this.files[i];
        $.ajax({
            url : s3presignedApiUri,
            data: 'file='+ file.name + '&mime=' + file.type,
            type : "GET",
            dataType : "json",
            cache : false,
        })
        .done(function(s3presignedUrl) {
            $.ajax({
                url : s3presignedUrl,
                type : "PUT",
                data : file,
                dataType : "text",
                cache : false,
                contentType : file.type,
                processData : false
            })
            .done(function(){
                console.info('YEAH', s3presignedUrl.split('?')[0].substr(6));
            }
            .fail(function(){
                console.error('damn...');
            }
        })
    }
};
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <AllowedMethod>HEAD</AllowedMethod>
        <AllowedMethod>DELETE</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>
 类似资料:
  • 我需要直接从浏览器上传一个文件到S3。开始时,我创建了一个脚本,该脚本正在工作,但为了授权,我需要将我的凭据accessKeyId和secretAccessKey放入其中,这是不安全的。 我发现我可以使用“授权签名”进行授权 这看起来不错,但我找不到在upload()方法中将此授权头放在请求的何处。 我的授权标头示例: 授权:AWS4-HMAC-SHA256凭证=/20151016//s3/AWS

  • 我知道使用以下方法限制对象的上载大小:http://doc.s3.amazonaws.com/proposals/post.html#limiting_uploaded_content 但是我想知道如何在服务器端以IAM用户的身份使用S3 SDK生成预签名url的同时完成。

  • 我正在使用预先签名的URL将视频上载到AWS S3,上载成功,但当我尝试从S3下载视频并在媒体播放器(VLC或quickTime)中播放时,它不播放! 生成的预签名URL在中运行良好,但在和中也会出现与上述相同的问题。

  • 问题内容: 因此,我在将文件直接上传到S3时遇到了一些麻烦。目前,我的流程是向nodejs / express请求以获取签名的URL。 然后,我的角度控制器尝试使用该签名的URL($ scope.uploadDocument())直接上传到s3。 我的html表单看起来像 但是,每当我尝试上传到S3时,都会出现错误 我知道S3CORS在该存储桶的亚马逊端已正确设置,因为我已经开发了将相同存储桶用于

  • 我们正在构建基于java的GUI以将非常大的文件上传到S3桶。我们从API获取预先签名的URL,然后点击此URL上传我们的文件。 现在,由于文件大小非常大(10 GB),我们希望显示用户数据传输统计数据(例如,传输了多少数据、传输速率等)。 重要提示-我们没有AWS ID-KEY来访问bucket,所以我们不能使用AWS SDK。 任何一个指针都会很有帮助,我们将不胜感激。

  • 我正在尝试使用预先签名的URL为Vue应用程序实现图片上传功能。第一步是向API发送请求,该API将创建签名URL以上载文件。这部分很好: 服务器端: API终结点发送类似于此的响应: 客户端将使用上传url将文件上传到S3存储桶。以下是客户端代码: 不幸的是,我在使用签名URL时遇到了一个禁止的403错误。以下是我从Chrome浏览器中获得的控制台错误的结果: 上传至:https://s3.us