2014-04-01 17 views
7

Tôi đang PUTting tệp tới S3 thông qua yêu cầu ajax và khoảng 50% thời gian tôi nhận được lỗi ERR_CONNECTION_RESET.ERR_CONNECTION_RESET khi PUTting đến S3

Tôi biết các yêu cầu được ký chính xác - bất kỳ ý tưởng nào có thể gây ra điều này? Một lần nữa, đây là một vấn đề liên tục mà tôi thấy từ nhiều địa điểm và máy móc.

Đây là mã coffeescript có liên quan mà tôi đang sử dụng để PUT tệp của tôi tới S3. Nó có nguồn gốc từ tác phẩm của Micah Roberson và Rok Krulec tại 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 

Cập nhật

tôi đã nhận được sự ủng hộ rất chu đáo từ Amazon về vấn đề này. Theo đề xuất của họ, tôi đã tạo một cá thể Windows EC2, tải trình duyệt Chrome lên đó và cố gắng tải lên 5 tệp 10 lần với mã của tôi. Tôi không thấy lỗi một lần. Đôi khi tôi đã gặp một số lỗi SignatureDoesNotMatch nhưng không gặp lỗi ERR_CONNECTION_RESET. Tôi vẫn thấy lỗi ERR_CONNECTION_RESET mặc dù trên mọi vị trí máy khách/mạng không phải EC2 mà tôi sử dụng.

Cập nhật Vẫn không có giải pháp nào ở đây. Tôi đã chuyển từ sử dụng thuật toán ký tự cuộn sang một thuật toán được cung cấp bởi boto. Tuy nhiên, không ảnh hưởng đến vấn đề ERR_CONNECTION_RESET.

+0

Nếu ai đó đang gặp vấn đề tương tự, tôi sẽ đánh giá cao việc biết tôi không đơn độc. ;) – Erik

+1

Tôi đang gặp vấn đề tương tự! Tôi đang sử dụng cùng một bộ tài nguyên (blog và mã mô hình), và có kết quả chính xác như nhau. Khoảng một nửa thời gian, yêu cầu cung cấp ERR_CONNECTION_RESET không có thông tin khác. –

+1

Cảm ơn Joan. Tôi có một câu hỏi tích cực với AWS, nhưng nó đòi hỏi tôi phải sao chép mã trình duyệt của tôi như là một quá trình độc lập để họ gỡ lỗi - điều này đòi hỏi một số phát triển. – Erik

Trả lời

1

Tôi cuối cùng đã từ bỏ việc làm việc này. Thay vào đó, tôi hiện đang sử dụng Fine Uploader để cung cấp chức năng này.

0

Tôi cho rằng vấn đề này không có quyết định.

Hãy thử một yêu cầu POST: https://aws.amazon.com/articles/1434

<form action="https://s3-bucket.s3.amazonaws.com/" method="post" enctype="multipart/form-data"> 
    <input type="hidden" name="key" value="uploads/${filename}"> 
    <input type="hidden" name="AWSAccessKeyId" value="YOUR_AWS_ACCESS_KEY"> 
    <input type="hidden" name="acl" value="private"> 
    <input type="hidden" name="success_action_redirect" value="http://localhost/"> 
    <input type="hidden" name="policy" value="YOUR_POLICY_DOCUMENT_BASE64_ENCODED"> 
    <input type="hidden" name="signature" value="YOUR_CALCULATED_SIGNATURE"> 
    <input type="hidden" name="Content-Type" value="image/jpeg"> 
    <!-- Include any additional input fields here --> 

    File to upload to S3: 
    <input name="file" type="file"> 
    <br> 
    <input type="submit" value="Upload File to S3"> 
</form> 

Sử dụng FormData để nối thêm lĩnh vực, nếu bạn thích AJAX gửi

Để ký một yêu cầu trong nodejs: Amazon S3 POST api, and signing a policy with NodeJS

1

Tôi chạy vào vấn đề này khi tải lên các tệp lớn hơn (các yêu cầu dài) với các URL được ký trước, sau Heroku's example (nút 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(); 
    }); 
}); 

Thông số "Hết hạn" làm cho URL đã ký hợp lệ trong 60 giây.

Tôi đã tìm ra yêu cầu gặp sự cố khi URL đã ký hết hạn vào giữa quá trình tải lên (mặc dù URL này đã hợp lệ khi tải lên bắt đầu).

Nó không bị hỏng chính xác sau 60 giây, nhưng ngẫu nhiên trong khoảng từ 60 đến 120 giây. Hầu hết thời gian, khách hàng ghi ERR_CONNECTION_RESET và các lần khác, nhật ký này ghi lại 403 FORBIDDEN.

Sau khi xoay nó lên đến 3600, tôi không còn vấn đề gì nữa.

Tôi nghi ngờ vấn đề không xảy ra trên EC2 vì chúng có tốc độ tải lên rất nhanh.

Các vấn đề liên quan