2016-03-25 1 views
14

Ich bin in eine seltsame Situation, in der einige Dateien, speziell ZIP-Format, beim Hochladen auf AWS innerhalb meiner Rails App sind beschädigt/konvertiert. Wenn sie heruntergeladen und dekomprimiert werden, werden sie in ein CPGZ-Format umgewandelt, das wieder in eine ZIP-Datei dekomprimiert wird, und dies unendlich.Rails Upload zu AWS erstellen .zip.cpgz Datei Schleife

Ich habe kein Muster bemerkt, das dies verursacht, so dass es scheinbar sporadisch ist, und kann bestätigen, dass die Dateien vor dem Upload nicht beschädigt sind. Die einzige andere issue/topic Ich habe darauf gefunden, bezieht sich auf PHP, und scheint unterschiedliche Umstände sein.

Ich verwende AWS SDK for Ruby v1 (nicht v2 wegen meiner Rails-Version) und jQuery-File-Upload. Da einige der Dateien groß sind, verwende ich Chunked-Uploads.

In meinem Controller wird die presigned POST URL wie folgt erstellt:

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

Und jQuery Datei-Upload ist wie so (einige Teile aus Gründen der Kürze entfernt) ein:

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 
    } 
}); 

Hat jemand das erlebt? Es ist sehr frustrierend.

+0

Haben Sie „Hochladen“ in einen temporären Ordner auf der lokalen Festplatte versucht? Wenn ja, tritt die gleiche Korruption auf? –

+0

@AnthonyE Wie würde ich den Upload lokal testen? –

Antwort

2

Set Inhaltstyp zu Anwendung/zip, wenn Sie die Anfrage senden.

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

+0

Danke für den Vorschlag! Ich habe meine POST-URL in 'S3_BUCKET.presigned_post (Schlüssel:" uploads/# {SecureRandom.uuid} - $ {filename} ", content_type: 'application/zip', success_action_status: '201')' geändert, aber leider bekomme ich immer noch die CPGZ-Datei beim Hochladen. –

+0

Funktioniert es, wenn Sie nicht chunking sind? oder haben Sie das gleiche Problem. versuchen zu isolieren, was die Datenbeschädigung verursacht und wann? – Shishir

+0

Ihr Vorschlag endete hier als Fixpunkt! Ich hatte kein Chunking richtig eingerichtet. Fühlen Sie sich frei, eine offizielle Antwort zu erstellen, und ich werde es akzeptieren. –

Verwandte Themen