【问题标题】:Rails upload to AWS creating .zip.cpgz file loopRails 上传到 AWS 创建 .zip.cpgz 文件循环
【发布时间】:2016-07-13 16:57:09
【问题描述】:

我遇到了一种奇怪的情况,在我的 Rails 应用程序中上传到 AWS 时,某些文件(特别是 ZIP 格式)已损坏/转换。下载并解压后,它们会变成 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 File Upload 是这样设置的(为简洁起见,删除了一些部分):

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

有人经历过吗?这很令人沮丧。

【问题讨论】:

  • 您是否尝试过“上传”到本地磁盘上的临时文件夹?如果是这样,是否会发生同样的损坏?
  • @AnthonyE 如何在本地测试上传?

标签: ruby-on-rails amazon-s3 zip jquery-file-upload aws-sdk


【解决方案1】:

在发送请求时将 content-type 设置为 application/zip

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

【讨论】:

  • 感谢您的建议!我将我的 POST URL 更改为 S3_BUCKET.presigned_post(key: "uploads/#{SecureRandom.uuid}-${filename}", content_type: 'application/zip', success_action_status: '201'),但不幸的是,我在上传时仍然得到 CPGZ 文件。
  • 如果您不分块,它是否有效?还是你面临同样的问题。试图找出导致数据损坏的原因和时间?
  • 您的建议最终解决了问题!我没有正确设置分块。随意创建一个官方答案,我会接受它。
猜你喜欢
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多