区块直接上传到s3 jquery文件上传,只保存最后一个区块

区块直接上传到s3 jquery文件上传,只保存最后一个区块,jquery,file-upload,amazon-s3,blueimp,Jquery,File Upload,Amazon S3,Blueimp,我使用这个插件直接从JS客户端代码上传文件到AWSS3。我使用了多部分上传。以下是文件上载的设置: 多部分:正确, maxChunkSize:10*1024*1024, 自动上传:对, 当我使用此事件侦听器记录响应时:“fileuploadchunkdone”我可以看到所有已上载的区块,但在bucket中只保存最后一个区块。此外,当我在上传过程中观察我的bucket时,我可以看到文件大小等于块大小,但上传后文件的完整大小等于最后一个块大小,并且文件已损坏 我做错什么了吗?或者这是个虫子 以下

我使用这个插件直接从JS客户端代码上传文件到AWSS3。我使用了多部分上传。以下是文件上载的设置:


多部分:正确,
maxChunkSize:10*1024*1024,
自动上传:对,

当我使用此事件侦听器记录响应时:
“fileuploadchunkdone”
我可以看到所有已上载的区块,但在bucket中只保存最后一个区块。此外,当我在上传过程中观察我的bucket时,我可以看到文件大小等于块大小,但上传后文件的完整大小等于最后一个块大小,并且文件已损坏

我做错什么了吗?或者这是个虫子

以下是我的S3设置:

CORS:


*
得到
邮递
放
删除
3000
埃塔格
内容类型
内容范围
内容配置
x-amz-acl
x-amz-meta-qqfilename
x-amz-date
授权
*
谢谢你的帮助

更新:

下面是我用于此目的的js代码:

$('.upload-video-part').each(function(){
  var that = this;
  var videoId;
  $(this).fileupload({
    sequentialUploads: true,
    multipart: true,
    disableValidation: true,
    maxChunkSize: 10 * 1024 * 1024,
    autoUpload: true,
    add: function (event, data) {
      $(that).find('input[type=file]').hide();
      $(that).find('#progress').show();
      $.ajax({
        url: "/uploaded_videos",
        type: 'POST',
        dataType: 'json',
        data: {doc: {title: data.files[0].name}},
        async: false,
        success: function(retdata) {
          $(that).find('input[name=key]').val(retdata.key);
          $(that).find('input[name=policy]').val(retdata.policy);
          $(that).find('input[name=signature]').val(retdata.signature);
          $(that).parent().append('<div id="video-edit-form-' + retdata.id + '"></div>');
          videoId = retdata.id;
          data.submit();
          $.get({
            url: "/edit_after_upload?id=" + videoId,
            success: function(data) {
              $('#edit_uploaded_video_' + retdata.id).submit(function(e, data){
                e.preventDefault();
                var messageArea = $('#edit_uploaded_video_' + retdata.id).find('.message-area')[0];
                $.ajax({
                  type: 'PUT',
                  url: $('#edit_uploaded_video_' + retdata.id).attr('action'),
                  data: $('#edit_uploaded_video_' + retdata.id).serialize(),
                  success: function(data) {
                    $(messageArea).css('color', 'rgba(0, 255, 0, .5');
                    messageArea.innerHTML = 'Video was successfuly saved!';
                    $(messageArea).css('display', 'inline-block');
                  },
                  error: function(err){
                    $(messageArea).css('color', 'rgba(255, 0, 0, .5');
                    messageArea.innerHTML = err.responseJSON.errors;
                    $(messageArea).css('display', 'inline-block');
                  }
                });
                return false;
              });
            }
          });
        }
      });
    },
    send: function(e, data) {},
    fail: function(e, data) {
      $(that).find('.fileinput-button span')[0].innerHTML = 'Video uploading failed';
      $(that).find('#progress .bar').css('background', 'red');
    },
    done: function (event, data) {
      $(that).find('.fileinput-button span')[0].innerHTML = 'Video successfully uploaded';
      $(that).find('#progress .bar').css('background', 'green');
    },
    progressall: function (e, data) {
      var progress = parseInt(data.loaded / data.total * 100, 10);
      $(that).find('#progress .bar').css( 'width', progress + '%');
    }
  }).on('fileuploadchunksend', function (e, data) {});
});
$('.upload video part')。每个(函数(){
var=这个;
视频识别码;
$(此).fileupload({
顺序上传:正确,
多部分:正确,
disableValidation:正确,
maxChunkSize:10*1024*1024,
自动上传:对,
添加:功能(事件、数据){
$(that.find('input[type=file]').hide();
$(that.find(“#progress”).show();
$.ajax({
url:“/上传的视频”,
键入:“POST”,
数据类型:“json”,
数据:{doc:{title:data.files[0].name},
async:false,
成功:函数(retdata){
$(that.find('input[name=key]').val(retdata.key);
$(that.find('input[name=policy]').val(retdata.policy);
$(that.find('input[name=signature]').val(retdata.signature);
$(that.parent().append(“”);
videoId=retdata.id;
data.submit();
美元({
url:“/edit\u after\u upload?id=“+videoId,
成功:功能(数据){
$(编辑上传的视频+retdata.id)。提交(函数(e,数据){
e、 预防默认值();
var messageArea=$('#编辑上传的视频'+retdata.id)。查找('.message area')[0];
$.ajax({
键入:“PUT”,
url:$('#编辑上传的视频'+retdata.id).attr('action'),
数据:$('#编辑上传的视频'+retdata.id).serialize(),
成功:功能(数据){
css('color','rgba(0,255,0,5');
messageArea.innerHTML='视频已成功保存!';
$(messageArea).css('display','inlineblock');
},
错误:函数(err){
css('color','rgba(255,0,0,5');
messageArea.innerHTML=err.responseJSON.errors;
$(messageArea).css('display','inlineblock');
}
});
返回false;
});
}
});
}
});
},
send:函数(e,data){},
失败:功能(e,数据){
$(即).find('.fileinput按钮span')[0].innerHTML='Video Upload failed';
$(that.find('#progress.bar').css('background','red');
},
完成:功能(事件、数据){
$(即).find('.fileinput按钮span')[0].innerHTML='Video successfully Upload';
$(that.find('#progress.bar').css('background','green');
},
progressall:功能(e、数据){
var progress=parseInt(data.loaded/data.total*100,10);
.css('width',progress+'%');
}
}).on('fileuploadchunksend',函数(e,data){});
});

在s3中以多个块上载文件。首先使用s3 api创建多部分上载

通过此api,您将收到上载id

然后使用此api上载零件,并在数据中提供零件号和上载id

使用此api中的etag和partNumber receive来使用api_CompleteMultipartUpload完成partUpload


这肯定不是CORs相关的。如果你上传同一个部件号不止一次,S3不出错,那么你所描述的症状将是准确的预期行为,如果你有一个bug告诉你你上传的是第1部分,然后是第1部分,然后是第1部分,然后是第1部分,调用每个PAR。t“第1部分”在API请求中,而不是在第n部分中,然后发送一个只包含上一部分元数据的完成请求…这将是您的代码或您正在使用的库中的一个严重缺陷。这到底是什么库?我找不到我认为您正在使用的库的证据,实际上正在进行S3多部分上载。链接对于您正在使用的文档,可能需要您自己编辑到问题中的代码。Michael,我使用。我不确定是否可以设置每个区块的数量。谢谢。似乎我最初对您尝试执行的操作做了一些不正确的假设。S3有一个允许您上载每个“区块”的(不涉及分块编码)使用部件号,当你完成后,你发送回每个上传部件的etag,S3将它们组合成一个对象…这不是你正在做的。我不清楚你所做的是否符合该模块和S3接口的设计意图。请展示你的代码。
$('.upload-video-part').each(function(){
  var that = this;
  var videoId;
  $(this).fileupload({
    sequentialUploads: true,
    multipart: true,
    disableValidation: true,
    maxChunkSize: 10 * 1024 * 1024,
    autoUpload: true,
    add: function (event, data) {
      $(that).find('input[type=file]').hide();
      $(that).find('#progress').show();
      $.ajax({
        url: "/uploaded_videos",
        type: 'POST',
        dataType: 'json',
        data: {doc: {title: data.files[0].name}},
        async: false,
        success: function(retdata) {
          $(that).find('input[name=key]').val(retdata.key);
          $(that).find('input[name=policy]').val(retdata.policy);
          $(that).find('input[name=signature]').val(retdata.signature);
          $(that).parent().append('<div id="video-edit-form-' + retdata.id + '"></div>');
          videoId = retdata.id;
          data.submit();
          $.get({
            url: "/edit_after_upload?id=" + videoId,
            success: function(data) {
              $('#edit_uploaded_video_' + retdata.id).submit(function(e, data){
                e.preventDefault();
                var messageArea = $('#edit_uploaded_video_' + retdata.id).find('.message-area')[0];
                $.ajax({
                  type: 'PUT',
                  url: $('#edit_uploaded_video_' + retdata.id).attr('action'),
                  data: $('#edit_uploaded_video_' + retdata.id).serialize(),
                  success: function(data) {
                    $(messageArea).css('color', 'rgba(0, 255, 0, .5');
                    messageArea.innerHTML = 'Video was successfuly saved!';
                    $(messageArea).css('display', 'inline-block');
                  },
                  error: function(err){
                    $(messageArea).css('color', 'rgba(255, 0, 0, .5');
                    messageArea.innerHTML = err.responseJSON.errors;
                    $(messageArea).css('display', 'inline-block');
                  }
                });
                return false;
              });
            }
          });
        }
      });
    },
    send: function(e, data) {},
    fail: function(e, data) {
      $(that).find('.fileinput-button span')[0].innerHTML = 'Video uploading failed';
      $(that).find('#progress .bar').css('background', 'red');
    },
    done: function (event, data) {
      $(that).find('.fileinput-button span')[0].innerHTML = 'Video successfully uploaded';
      $(that).find('#progress .bar').css('background', 'green');
    },
    progressall: function (e, data) {
      var progress = parseInt(data.loaded / data.total * 100, 10);
      $(that).find('#progress .bar').css( 'width', progress + '%');
    }
  }).on('fileuploadchunksend', function (e, data) {});
});