Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Heroku';s使用Python上传到AWS S3的指南,返回403_Python_Heroku_Amazon S3 - Fatal编程技术网

使用Heroku';s使用Python上传到AWS S3的指南,返回403

使用Heroku';s使用Python上传到AWS S3的指南,返回403,python,heroku,amazon-s3,Python,Heroku,Amazon S3,我正在学习Heroku关于使用Javascript将图像上传到Amazon的教程 看起来我已经按照教程做了所有的事情,但是我仍然得到403拒绝访问错误 我的bucket名为media.better.herokuapp.com,它对应于S3\u bucket环境变量AWS_ACCESS_KEY和AWS_SECRET_KEY变量从Amazon web界面小心复制。这些不是用户凭据,而是帐户凭据 “提供对AWS资源的无限制访问。” 生成请求URL的代码: @login_required def sig

我正在学习Heroku关于使用Javascript将图像上传到Amazon的教程

看起来我已经按照教程做了所有的事情,但是我仍然得到403拒绝访问错误

我的bucket名为media.better.herokuapp.com,它对应于
S3\u bucket
环境变量
AWS_ACCESS_KEY
AWS_SECRET_KEY
变量从Amazon web界面小心复制。这些不是用户凭据,而是帐户凭据

“提供对AWS资源的无限制访问。”

生成请求URL的代码:

@login_required
def sign_s3(request):

    AWS_ACCESS_KEY = os.environ.get('AWS_ACCESS_KEY')
    AWS_SECRET_KEY = os.environ.get('AWS_SECRET_KEY')
    S3_BUCKET = os.environ.get('S3_BUCKET')

    object_name = request.GET.get('s3_object_name')
    mime_type = request.GET.get('s3_object_type')

    expires = long(time.time()+10)
    amz_headers = "x-amz-acl:public-read"

    put_request = "PUT\n\n%s\n%d\n%s\n/%s/%s" % (mime_type, expires, amz_headers, S3_BUCKET, object_name)

    signature = base64.encodestring(hmac.new(AWS_SECRET_KEY, put_request, sha1).digest())
    signature = urllib.quote(urllib.quote_plus(signature.strip()))

    url = 'https://%s.s3.amazonaws.com/%s' % (S3_BUCKET, object_name)

    return HttpResponse(
        json.dumps({
        'signed_request': '%s?AWSAccessKeyId=%s&Expires=%d&Signature=%s' % (url, AWS_ACCESS_KEY, expires, signature),
         'url': url
      })
    )
根据Heroku教程,实际发送请求的代码也是基于:

<script>

  function s3_upload(){
    var status_elem = document.getElementById("status");
    var url_elem = document.getElementById("avatar_url");
    var preview_elem = document.getElementById("preview");
    var s3upload = new S3Upload({
        file_dom_selector: 'file',
        s3_sign_put_url: '/sign_s3/',

        onProgress: function(percent, message) {
            status_elem.innerHTML = 'Upload progress: ' + percent + '% ' + message;
        },
        onFinishS3Put: function(url) {
            status_elem.innerHTML = 'Upload completed. Uploaded to: '+ url;
            url_elem.value = url;
            preview_elem.innerHTML = '<img src="'+url+'" style="width:300px;" />';
        },
        onError: function(status) {
            console.log(status);
            status_elem.innerHTML = 'Upload error: ' + status;
        }
    });
}

</script>
那么还缺少什么呢

我考虑的选项有:

  • 上传的文件命名有问题-如果你看 在request.GET dict中,JS库命名所有输入文件
    default\u name
  • AWS的帐户凭据以某种方式启用
    选项
    请求 但是禁用
    PUT
    请求,必须解决这些问题 特别是,尽管AWS手册中说它们是全系统的
  • localhost
    origin必须以某种方式单独添加到CORS配置中

或者还有别的什么吗?

403来自您的heroku应用程序,而不是S3。你登录了吗?@Enrico我甚至还没有使用Heroku,只是在开发locallySorry,我被
media.better.herokuapp.com
弄糊涂了,但我的观点仍然站得住脚<代码>http://localhost:8000/game/c54b02c3/返回的是403,而不是S3。您的函数用
@login\u required
修饰,因此您是否在localhost上登录到web应用程序?@Enrico是的,我已登录,该函数工作并输出Json数据。否则它就不会将请求URL返回到客户端的JS函数,对Amazon的请求也不会发生;但它做到了,这就产生了AWS日志。但你怎么会认为是我的函数返回403?根据AWS日志格式,
http://localhost:8000/game/c54b02c3/
只是HTTP引用头。
<?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>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>
149cbdd537e09d49c6f979053efd3c99ab2a75b0d80bb72dabe40782d9f6e68e media.better.herokuapp.com [25/Feb/2015:03:58:32 +0000] 103.247.121.189 - 5AFE4968D1986AFD REST.OPTIONS.PREFLIGHT default_name "OPTIONS /default_name?AWSAccessKeyId=AKIAJTAAJTDNVNPEVKJA&Expires=1424836708&Signature=9G6eOA1%252BUDhpGcem4JOODG2up1c%253D HTTP/1.1" 200 - - - 12 - "http://localhost:8000/game/c54b02c3/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36" -
149cbdd537e09d49c6f979053efd3c99ab2a75b0d80bb72dabe40782d9f6e68e media.better.herokuapp.com [25/Feb/2015:03:58:33 +0000] 103.247.121.189 - 73F995CAE6564A1A REST.PUT.OBJECT default_name "PUT /default_name?AWSAccessKeyId=AKIAJTAAJTDNVNPEVKJA&Expires=1424836708&Signature=9G6eOA1%252BUDhpGcem4JOODG2up1c%253D HTTP/1.1" 403 AccessDenied 321 - 5 - "http://localhost:8000/game/c54b02c3/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36" -