gpt4 book ai didi

ajax - PUTting 到 S3 时出现 ERR_CONNECTION_RESET

转载 作者:行者123 更新时间:2023-12-02 07:52:29 26 4
gpt4 key购买 nike

我通过 ajax 请求将文件放入 S3,大约 50% 的时间我会收到 ERR_CONNECTION_RESET 错误。

我知道请求已正确签名 - 有什么想法可能导致此情况吗?同样,这是我从多个位置和机器上看到的间歇性问题。

这是我用来将文件放入 S3 的相关 CoffeeScript 代码。它源自 Micah Roberson 和 Rok Krulec 的工作 http://micahroberson.com/upload-files-directly-to-s3-w-backbone-on-heroku/http://codeartists.com/post/36892733572/how-to-directly-upload-files-to-amazon-s3-from-your .

  createCORSRequest: (method, url) ->
xhr = new XMLHttpRequest()

if xhr.withCredentials?
xhr.open method, url, true
else if typeof XDomainRequest != "undefined"
xhr = new XDomainRequest()
xhr.open method, url
else
xhr = null

xhr

uploadToS3: (file, signature) ->
this_s3upload = this
this_s3upload.signature = signature
url = signature.signed_request

xhr = @createCORSRequest 'PUT', decodeURIComponent(signature.signed_request)

if !xhr
@onError 'CORS not supported'
else
xhr.onload = () ->
if xhr.status == 200
this_s3upload.onProgress 100, 'Upload completed.'
this_s3upload.onFinishS3Put file, this_s3upload.signature
else
this_s3upload.onError file, 'Upload error: ' + xhr.status

xhr.onerror = () ->
this_s3upload.onError file, 'XHR error.', this_s3upload.signature

xhr.upload.onprogress = (e) ->
if e.lengthComputable
percentLoaded = Math.round (e.loaded / e.total) * 100

if percentLoaded == 100
message = "Finalizing"
else
message = "Uploading"

this_s3upload.onProgress xhr, file, percentLoaded, message, this_s3upload.signature

xhr.onabort = ->
this_s3upload.onAbort file, "XHR cancelled by user.", this_s3upload.signature

xhr.setRequestHeader 'Content-Type', file.type
xhr.setRequestHeader 'x-amz-acl', 'public-read'
xhr.send file

更新

在这个问题上我得到了亚马逊非常周到的支持。根据他们的建议,我创建了一个 EC2 Windows 实例,在其上加载了 Chrome 浏览器,并尝试使用我的代码上传 5 个文件 10 次。我一次都没有看到错误。我偶尔会看到一些 SignatureDoesNotMatch 错误,但没有看到一个 ERR_CONNECTION_RESET 错误。尽管在我使用的每个非 EC2 客户端/网络位置上,我仍然看到 ERR_CONNECTION_RESET 错误。

更新这里仍然没有解决方案。我已经从使用自滚动签名算法转向使用 boto 提供的算法。但对 ERR_CONNECTION_RESET 问题没有影响。

最佳答案

我在使用预签名 URL 上传较大文件(长请求)时遇到了此问题,如下 Heroku's example (节点AWS SDK):

app.get('/sign-s3', (req, res) => {
const s3 = new aws.S3();
const fileName = req.query['file-name'];
const fileType = req.query['file-type'];
const s3Params = {
Bucket: S3_BUCKET,
Key: fileName,
Expires: 60,
ContentType: fileType,
ACL: 'public-read'
};

s3.getSignedUrl('putObject', s3Params, (err, data) => {
if(err){
console.log(err);
return res.end();
}
const returnData = {
signedRequest: data,
url: `https://${S3_BUCKET}.s3.amazonaws.com/${fileName}`
};
res.write(JSON.stringify(returnData));
res.end();
});
});

“Expires”参数使签名 URL 的有效期为 60 秒。

我认为,当签名 URL 在上传过程中过期时,请求会崩溃(即使在上传开始时它是有效的)。

它不会在 60 秒后崩溃,而是在 60 到 120 秒之间随机崩溃。大多数情况下,客户端会记录 ERR_CONNECTION_RESET,有时会记录 403 FORBIDDEN。

将其调至 3600 后,我不再遇到任何问题。

我怀疑 EC2 上没有发生此问题,因为它们的上传速度非常快。

关于ajax - PUTting 到 S3 时出现 ERR_CONNECTION_RESET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22798774/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com