2014-04-01 6 views
7

Sto trasmettendo file a S3 tramite richieste ajax e circa il 50% del tempo in cui si verificano errori ERR_CONNECTION_RESET.ERR_CONNECTION_RESET quando PUTting su S3

So che le richieste sono firmate correttamente - qualche idea che cosa potrebbe causare questo? Ancora una volta, questo è un problema intermittente che vedo da più postazioni e macchine.

Ecco il codice coffeescript relativo che sto utilizzando per mettere i miei file su S3. Deriva dai lavori di Micah Roberson e Rok Krulec allo http://micahroberson.com/upload-files-directly-to-s3-w-backbone-on-heroku/ e allo 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 

Aggiornamento

Sono stato sempre molto attento sostegno da Amazon su questo tema. Per loro suggerimento, ho creato un'istanza di Windows EC2, caricato il browser Chrome e tentato di caricare 5 file 10 volte con il mio codice. Non ho visto l'errore una volta. Ho riscontrato alcuni errori di SignatureDoesNotMatch occasionalmente, ma non un singolo errore ERR_CONNECTION_RESET. Sto ancora vedendo errori ERR_CONNECTION_RESET su ogni client non-EC2/percorso di rete che utilizzo.

Aggiornamento Ancora nessuna soluzione qui. Mi sono trasferito dall'usare un algoritmo di autofullazione a quello fornito da boto. Nessun impatto sul problema ERR_CONNECTION_RESET però.

+0

Se qualcun altro sta avendo lo stesso problema, gradirei sapere che non sono solo. ;) – Erik

+1

Sto avendo lo stesso problema! Sto usando lo stesso insieme di risorse (il blog e il codice del modello) e ho lo stesso risultato. Circa la metà delle volte, la richiesta restituisce ERR_CONNECTION_RESET senza altre informazioni. –

+1

Grazie Joan. Ho una domanda attiva in AWS, ma mi richiede di replicare il mio codice del browser come processo autonomo per eseguire il debug, il che richiede un po 'di sviluppo. – Erik

risposta

1

Alla fine ho rinunciato a farlo funzionare. Invece, ora sto usando Fine Uploader per fornire questa funzionalità.

0

Suppongo che questo problema non abbia alcuna decisione.

Prova una richiesta 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> 

Usa FormData per aggiungere i campi, se si preferisce AJAX invio

Per firmare una richiesta in nodejs: Amazon S3 POST api, and signing a policy with NodeJS

1

Mi sono imbattuto in questo problema quando caricamento di file più grandi (lunghe richieste) con URL preconfigurati, dopo Heroku's example (nodo 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(); 
    }); 
}); 

Il parametro "Scade" rende l'URL firmato valido per 60 secondi.

Ho calcolato che la richiesta si interrompe quando l'URL firmato scade nel mezzo del caricamento (anche se era valido all'avvio del caricamento).

Non si arresta esattamente dopo 60 secondi, ma casualmente tra 60 e 120 secondi. La maggior parte delle volte, il client registra ERR_CONNECTION_RESET e altre volte registra 403 FORBIDDEN.

Dopo aver avviato fino a 3600 non ho più avuto problemi.

Sospetto che il problema non si sia verificato sugli EC2 perché hanno velocità di caricamento molto elevate.