Rails 上传到 AWS 创建 .zip.cpgz 文件循环
Rails upload to AWS creating .zip.cpgz file loop
我 运行 遇到了一种奇怪的情况,在我的 Rails 应用程序中上传到 AWS 的某些文件(特别是 ZIP 格式)是 corrupted/converted。下载并解压后,它们会变成 CPGZ 格式,再解压回 ZIP,并无限循环。
我没有注意到导致这种情况的模式,所以它似乎是零星的,并且可以在上传之前确认文件没有损坏。我发现的唯一其他 issue/topic 与 PHP 有关,而且情况似乎有所不同。
我正在使用 AWS SDK for Ruby v1 (not v2 because of my Rails version) and jQuery-File-Upload。由于部分文件较大,我使用分块上传。
在我的控制器中,预签名 POST URL 是这样创建的:
S3_BUCKET.presigned_post(key: "uploads/#{SecureRandom.uuid}-${filename}", success_action_status: '201')
和jQuery文件上传设置如下(为简洁起见删除了一些部分):
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
}
});
有人遇到过这种情况吗?很郁闷。
发送请求时将content-type设置为application/zip。
参见https://github.com/aws/aws-sdk-ruby/blob/aws-sdk-v1/lib/aws/s3/presigned_post.rb
我 运行 遇到了一种奇怪的情况,在我的 Rails 应用程序中上传到 AWS 的某些文件(特别是 ZIP 格式)是 corrupted/converted。下载并解压后,它们会变成 CPGZ 格式,再解压回 ZIP,并无限循环。
我没有注意到导致这种情况的模式,所以它似乎是零星的,并且可以在上传之前确认文件没有损坏。我发现的唯一其他 issue/topic 与 PHP 有关,而且情况似乎有所不同。
我正在使用 AWS SDK for Ruby v1 (not v2 because of my Rails version) and jQuery-File-Upload。由于部分文件较大,我使用分块上传。
在我的控制器中,预签名 POST URL 是这样创建的:
S3_BUCKET.presigned_post(key: "uploads/#{SecureRandom.uuid}-${filename}", success_action_status: '201')
和jQuery文件上传设置如下(为简洁起见删除了一些部分):
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
}
});
有人遇到过这种情况吗?很郁闷。
发送请求时将content-type设置为application/zip。
参见https://github.com/aws/aws-sdk-ruby/blob/aws-sdk-v1/lib/aws/s3/presigned_post.rb