程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了尝试使用 Boto3(Django + Javascript)通过预先签名的帖子将文件上传到 AWS S3 时被禁止获取 403大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决尝试使用 Boto3(Django + Javascript)通过预先签名的帖子将文件上传到 AWS S3 时被禁止获取 403?@H_607_1@ 开发过程中遇到尝试使用 Boto3(Django + Javascript)通过预先签名的帖子将文件上传到 AWS S3 时被禁止获取 403的问题如何解决?下面主要结合日常开发的经验,给出你关于尝试使用 Boto3(Django + Javascript)通过预先签名的帖子将文件上传到 AWS S3 时被禁止获取 403的解决方法建议,希望对你解决尝试使用 Boto3(Django + Javascript)通过预先签名的帖子将文件上传到 AWS S3 时被禁止获取 403有所启发或帮助;

我已经尝试在 SO 和其他论坛上研究其他主题,但仍然无法解决这个问题。我正在向 S3 生成一个预先签名的帖子,并尝试使用这些标头将文件上传到它,但收到 403: ForbIDden。

权限 加载了 Boto3 的 IAM 用户具有列出、读取和写入 S3 的权限。

尝试使用 Boto3(Django + Javascript)通过预先签名的帖子将文件上传到 AWS S3 时被禁止获取 403

CORS 允许来自所有来源和所有标头的 CORS

[
{
    "Allowedheaders": [
        "*"
    ],"AllowedMethods": [
        "GET","head","POST","PUT"
    ],"AllowedOrigins": [
        "*"
    ],"Exposeheaders": []
}
]

代码 该代码基于 Django 中的 Python 以及 JavaScript。这是逻辑:

首先从 HTML 中检索文件,并用于调用检索签名 URL 的函数。

(function () {
    document.getElementByID("file-input").onchange = function () {
        let files = document.getElementByID("file-input").files;
        let file = files[0];
        Object.defineProperty(file,"name",{
            writeable: true,value: `${uuIDv4()}.pdf`

        })
        if (!filE) {
            return alert("No file SELEcted");
        }
        getSignedrequest(filE);
    }
})();

然后使用 Django 视图发送 GET 请求以检索签名 URL(在此视图之后的下一节中描述)

function getSignedrequest(filE) {
    var xhr = new XMLhttprequest();
    xhr.open("GET","/sign_s3?file_name=" + file.name + "&file_type=" + file.typE)
    xhr.onreadystatechange = function () {
        if (xhr.readyState === 4) {
            if (xhr.status === 200) {
                let response = JsON.parse(xhr.responseText)
                uploadfile(file,response.data,response.url)
            }
            else {
                alert("Could not get signed URL")
            }
        }
    };
    xhr.send()
}

生成签名 URL 的 Django 视图

def Sign_s3(request):

    S3_BUCKET = os.environ.get("BUCKEt_name")

    if (request.method == "GET"):
        file_name = request.GET.get('file_name')
        file_type = request.GET.get('file_type')
        
        s3 = boto3.clIEnt('s3',config = boto3.session.Config(signature_version = 's3v4'))
        
        presigned_post = s3.generate_presigned_post(
        Bucket = S3_BUCKET,Key = file_name,FIElds = {"acl": "public-read","Content-Type": file_typE},Conditions = [
        {"acl": "public-read"},{"Content-Type": file_typE}
        ],ExpiresIn = 3600
    )


    return JsonResponse({
        "data": presigned_post,"url": "https://%s.s3.amazonaws.com/%s" % (S3_BUCKET,file_name)
    })

最后应该将文件上传到存储桶(这是我收到 403 错误的地方)

function uploadfile(file,s3Data,url) {
            let xhr = new XMLhttprequest();
            xhr.open("POST",s3Data.url)

            let postData = new FormData()
            for (key in s3Data.fIElds) {
                postData.append(key,s3Data.fIElds[key])
            }

            postData.append("file",filE)

            xhr.onreadystatechange = function () {
                if (xhr.readyState === 4) {
                    if (xhr.status === 200 || xhr.status === 204) {
                        document.getElementByID("cv-url").value = url
                    }
                    else {
                        alert("Could not upload file")
                    }
                }
            };
            xhr.send(postData)
        }

网络请求 这是网络请求在浏览器中的样子

尝试使用 Boto3(Django + Javascript)通过预先签名的帖子将文件上传到 AWS S3 时被禁止获取 403

尝试使用 Boto3(Django + Javascript)通过预先签名的帖子将文件上传到 AWS S3 时被禁止获取 403

尝试使用 Boto3(Django + Javascript)通过预先签名的帖子将文件上传到 AWS S3 时被禁止获取 403

解决方法@H_607_1@

您应该在上传中使用的 URL 应该是预签名响应所具有的 URL。不要只是上传你想要的任何网址。

将您的回复更新为:

return JsonResponse({
  "data": presigned_post,"url": presigned_post.url
})

具体来说,您使用的网址如下所示:

https://BUCKTEt_name.s3.amazonaws.com/KEY_PATH

什么时候应该是这样:

https://s3.REGION.amazonaws.com/BUCKEt_name

然而,查看您的代码这是它应该做的,但检查员的屏幕截图却另有说明。为什么网络请求中的 url 与 create_presigned_post 请求返回的 url 不匹配?

,

@jellycsc 帮助了我。我必须打开存储桶的 BlockPublicAcl 选项才能使其工作。

大佬总结

以上是大佬教程为你收集整理的尝试使用 Boto3(Django + Javascript)通过预先签名的帖子将文件上传到 AWS S3 时被禁止获取 403全部内容,希望文章能够帮你解决尝试使用 Boto3(Django + Javascript)通过预先签名的帖子将文件上传到 AWS S3 时被禁止获取 403所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。