2013-05-03 2 views
7

У меня есть следующий код:Возникли проблемы загрузки блоб непосредственно s3

var fd = new FormData(); 

     var key = "events/" + (new Date).getTime() + '-'; 

     fd.append('key', key); 
     fd.append('acl', Acl); 
     fd.append('Content-Type', "image/jpeg"); 
     fd.append('AWSAccessKeyId', AWSAccessKeyId); 
     fd.append('policy', Policy); 
     fd.append('name', "Policy13492345"); 
     fd.append('success_action_status', "201"); 
     fd.append('signature', Signature);   
     fd.append("file", blob); 
     fd.append("filename", fileName + ".jpg"); 
     var xhr = new XMLHttpRequest(); 



     xhr.upload.addEventListener("progress", uploadProgress, false); 
     xhr.addEventListener("load", uploadComplete, false); 
     xhr.addEventListener("error", uploadFailed, false); 
     xhr.addEventListener("abort", uploadCanceled, false); 

     xhr.open('POST', 'https://s3.amazonaws.com/' + Bucket + '/', true); 

     xhr.send(fd); 

Когда этот запрос проходит через я получаю следующее сообщение об ошибке:

<Code>AccessDenied</Code><Message>Invalid according to Policy: Policy Condition failed: ["starts-with", "$Filename", ""]</Message>

Я понятия не имею, о чем я что я делаю неправильно, я генерирую свой блоб следующим образом:

function dataURItoBlob(dataURI) { 
       var binary = atob(dataURI.split(',')[1]); 
       var array = []; 
       for (var i = 0; i < binary.length; i++) { 
        array.push(binary.charCodeAt(i)); 
       } 
       var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0] 
       return new Blob([new Uint8Array(array)], { type: mimeString }); 
      } 

Это м у запроса:

------WebKitFormBoundaryxh8thnHAmDhZQuXE 
Content-Disposition: form-data; name="key" 

events/1367541109750- 
------WebKitFormBoundaryxh8thnHAmDhZQuXE 
Content-Disposition: form-data; name="acl" 

private 
------WebKitFormBoundaryxh8thnHAmDhZQuXE 
Content-Disposition: form-data; name="Content-Type" 

image/jpeg 
------WebKitFormBoundaryxh8thnHAmDhZQuXE 
Content-Disposition: form-data; name="AWSAccessKeyId" 

asdfasdfFASDFSDFAADSFHHVDQ 
------WebKitFormBoundaryxh8thnHAmDhZQuXE 
Content-Disposition: form-data; name="policy" 

FsnY29udFuZ2UnLCAwLCAxMDAwMDAwMDBdLAogICAgICasdfasdfAgIFsgJ3N0YXJ0cy13aXRoJywgJyRrZXknLCAnJyBdLAogICAgICAgIFsgJ3N0YXJ0cy13aXRoJywgJyRDb250ZW50LVR5cGUnLCAnasdfJyBdLAo 
------WebKitFormBoundaryxh8thnHAmDhZQuXE 
Content-Disposition: form-data; name="name" 

Policy134722343242345 
------WebKitFormBoundaryxh8thnHAmDhZQuXE 
Content-Disposition: form-data; name="success_action_status" 

201 
------WebKitFormBoundaryxh8thnHAmDhZQuXE 
Content-Disposition: form-data; name="signature" 

basdfasdftwa/9asdfasdfx3/zasdfadsft6g= 
------WebKitFormBoundaryxh8thnHAmDhZQuXE 
Content-Disposition: form-data; name="file"; filename="blob" 
Content-Type: image/jpeg 


------WebKitFormBoundaryxh8thnHAmDhZQuXE 
Content-Disposition: form-data; name="filename" 

C:\fakepath\495845894.jpg 
------WebKitFormBoundaryxh8thnHAmDhZQuXE-- 

ответ

7

Разобрался вопрос, заказ для данных формы очень важно, вы должны следовать правильному порядку для того, чтобы данные правильно размещать.

+1

Из [AWS Docs] (http://doc.s3.amazonaws.com/proposals/post.html#Variation_on_the_form) - файл должен быть последним элементом в форме. Мне потребовалось некоторое время, чтобы найти этот документ. так вот это ... – arty

+0

Я использую файл jimp-файла blueimp Загрузка и загрузка обрезанного изображения непосредственно на s3. Это работало для меня, чтобы добавить свойство файла в formData внутри события 'add'. '' ' data.formData = { ACL: 'общественного чтения', AWSAccessKeyId: res.s3Key, ключ: image_path, политика: res.s3PolicyBase64, подпись: res.s3Signature, файлов: данные. файлы [0] } '' ' – looshi