2016-03-25 16 views
14

Tôi đang gặp phải tình huống lạ khi một số tệp, định dạng ZIP cụ thể, khi được tải lên AWS trong ứng dụng Rails của tôi bị hỏng/chuyển đổi. Khi được tải xuống và giải nén chúng biến thành một định dạng CPGZ, giải nén trở lại vào một ZIP, và vô cùng thực hiện điều này.Rails tải lên AWS tạo tệp zip .pg.cpgz

Tôi chưa nhận thấy một mẫu gây ra lỗi này, vì vậy dường như không thường xuyên và có thể xác nhận rằng tệp không bị hỏng trước khi tải lên. Các chỉ khác issue/topic Tôi đã tìm thấy về điều này liên quan đến PHP, và có vẻ là hoàn cảnh khác nhau.

Tôi đang sử dụng AWS SDK for Ruby v1 (không phải v2 vì phiên bản Rails của tôi) và jQuery-File-Upload. Vì một số tệp lớn, tôi đang sử dụng tải lên chunked.

Trong điều khiển của tôi, URL POST presigned được tạo ra như thế này:

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

Và jQuery File Upload được thiết lập như vậy (một số bộ phận bị loại bỏ cho ngắn gọn):

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

Có ai kinh nghiệm này? Nó rất bực bội.

+0

Bạn đã thử "tải lên" vào thư mục tạm thời trên đĩa cục bộ của mình chưa? Nếu có, tham nhũng có xảy ra không? –

+0

@AnthonyE Tôi sẽ thử nghiệm tải lên cục bộ bằng cách nào? –

Trả lời

2

Đặt loại nội dung to application/zip khi bạn gửi yêu cầu.

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

+0

Cảm ơn bạn đã đề xuất! Tôi đã thay đổi URL POST thành 'S3_BUCKET.presigned_post (key:" uploads/# {SecureRandom.uuid} - $ {filename} ", content_type: 'application/zip', success_action_status: '201')' nhưng tiếc là tôi vẫn nhận được Tệp CPGZ khi tải lên. –

+0

Nó có hoạt động nếu bạn không chunking? hoặc làm u phải đối mặt với cùng một vấn đề. cố gắng để cô lập những gì đang gây ra sự tham nhũng dữ liệu và khi nào? – Shishir

+0

đề xuất của bạn cuối cùng đã được khắc phục ở đây! Tôi không có chunking thiết lập đúng cách. Hãy tạo một câu trả lời chính thức và tôi sẽ chấp nhận nó. –

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