2016-03-25 39 views
14

Mi trovo in una strana situazione in cui alcuni file, in particolare il formato ZIP, quando caricati su AWS all'interno della mia app Rails sono corrotti/convertiti. Quando vengono scaricati e decompressi, si trasformano in un formato CPGZ, che decomprime nuovamente in un ZIP e lo fa all'infinito.Rails caricati su AWS creando il file .zip.cpgz loop

Non ho notato uno schema che causa questo, quindi è apparentemente sporadico e può confermare che i file non sono corrotti prima del caricamento. L'unico altro issue/topic che ho trovato su questo si riferisce a PHP, e sembra essere circostanze diverse.

Sto usando AWS SDK for Ruby v1 (non v2 a causa della mia versione Rails) e jQuery-File-Upload. Poiché alcuni file sono grandi, sto utilizzando caricamenti a blocchi.

Nel mio controller, l'URL POST presigned si crea in questo modo:

S3_BUCKET.presigned_post(key: "uploads/#{SecureRandom.uuid}-${filename}", success_action_status: '201') 

E File jQuery Upload è impostato in questo modo (alcune parti rimosse per brevità):

this.$el.fileupload({ 
    fileInput: this.uploadField, // this is an <input type="file"> 
    url: this.awsURL, // https://BUCKET.s3.amazonaws.com/ 
    formData: JSON.parse(this.awsData), // {"AWSAccessKeyId":"...","key":"uploads/1234-${filename}","policy":"...","signature":"...","success_action_status":"201"} 
    type: 'POST', 
    autoUpload: true, 
    paramName: 'file', 
    dataType: 'XML', 
    replaceFileInput: false, 
    maxChunkSize: 1000000, 
    add: function(event, data) { 
    var file = data.files[0]; 
    var fileType = file.type; 

    // Check file type 
    if (~'ai sketch psd jpg jpeg png zip ttf woff eot gif'.indexOf(fileType.toLowerCase())) { 
     return alert('Sorry, that file type is not supported'); 
    }; 

    data.submit(); 
    }, 
    progress: function(event, data) { 
    // Display progress 
    }, 
    done: function(event, data) { 
    var file = data.files[0]; 
    var fileName = file.name.replace(/ /g,"_"); 
    var item = _this.uploadedItems[fileName]; 
    var key = $(data.jqXHR.responseXML).find("Key").text(); 
    // awsHost = BUCKET.s3.amazonaws.com 
    var url = '//' + _this.awsHost + '/' + key; 

    // Set form values using above info 
    }, 
    fail: function(event, data) { 
    // Alert failure 
    } 
}); 

Qualcuno ha sperimentato questo? È molto frustrante.

+0

Hai provato "upload" per una cartella temporanea sul disco locale? In tal caso, si verifica la stessa corruzione? –

+0

@AnthonyE come verifico il caricamento localmente? –

risposta

2

Impostare tipo di contenuto a application/zip quando si invia la richiesta.

VEDERE https://github.com/aws/aws-sdk-ruby/blob/aws-sdk-v1/lib/aws/s3/presigned_post.rb

+0

Grazie per il suggerimento! Ho cambiato il mio URL POST in 'S3_BUCKET.presigned_post (chiave:" uploads/# {SecureRandom.uuid} - $ {filename} ", content_type: 'application/zip', success_action_status: '201')' ma sfortunatamente ottengo ancora il File CPGZ al caricamento. –

+0

Funziona se non sei un chunking? o affronta lo stesso problema. cercando di isolare ciò che sta causando la corruzione dei dati e quando? – Shishir

+0

il tuo suggerimento è finito per essere la soluzione qui! Non avevo impostato correttamente il chunking. Sentiti libero di creare una risposta ufficiale e lo accetterò. –