我遇到一个奇怪的情况,一些文件,特别是ZIP格式,当我的Rails应用程序上传到AWS时,它们被损坏/转换.当下载和解压缩时,他们变成一个CPGZ格式,它解压缩成一个ZIP,无限地这样做.
我没有注意到导致这种情况的模式,所以看起来似乎是零星的,并且可以在上传之前确认文件没有被破坏.我发现的唯一其他issue/topic与PHP有关,似乎是不同的情况.
我使用AWS SDK for Ruby v1(不是v2,因为我的Rails版本)和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 } });
有没有人经历过这个?这很令人沮丧.
解决方法
发送请求时,将内容类型设置为application / zip.
SEE https://github.com/aws/aws-sdk-ruby/blob/aws-sdk-v1/lib/aws/s3/presigned_post.rb