javascript ajax jquery amazon-s3 amazon

javascript - Carga basada en el navegador SignatureDoesNotMatch en s3



ajax jquery (0)

Sé que muchos hicieron esta pregunta y revisé su publicación, pero todavía no recibí la respuesta correcta, así que aquí va.

Estoy tratando de subir una imagen a s3 usando la técnica de carga basada en navegador introducida por Amazon dev. En este momento puedo calcular tanto la política como la firma de mi lado. Pero cuando traté de subir una imagen, siempre obtengo una "Firma no coincidente" (>. <). Uno de los principales problemas que tengo es que las credenciales que tengo son solo temporales: AWS Security Token Service , este consiste en accessKEy, secretKey y token de seguridad. Publicaré mi código para que todos puedan

Aquí está mi conversión de policy_json

function setValues(accesskey, secretkey, token) { var folder = ''avatars/[email protected]/'', acl = ''public-read'', bucket = ''my-bucket''; var POLICY_JSON = { "expiration": "2013-12-03T12:29:27.000Z", "conditions": [ {"bucket": bucket}, ["starts-with", "$key", folder], {"acl": acl}, {"success_action_redirect": "201"}, ["starts-with", "$Content-Type", "image/png"] ] }; var policy = Base64.encode(JSON.stringify(POLICY_JSON)); var signature = b64_hmac_sha1(secretkey, policy); return { "policy":policy, "signature":signature, "folder" : folder, "acl" : acl, "bucket" : bucket } }

Mi carga

function upload(acl, accesskey, policy, signature, token) { $('':button'').click(function() { var file = document.getElementById(''file'').files[0]; // var key = "events/" + (new Date).getTime() + ''-'' + file.name; var xdate = ''20131016T105000Z''; // var formData = new FormData($(''form'')[0]); //$(''form'')[0] var formData = new FormData(); //$(''form'')[0] formData.append("key", "avatars/[email protected]/${filename}"); formData.append("acl", acl); formData.append("success_action_redirect", "201"); formData.append("Content-Type", file.type); formData.append("AWSAccessKeyId", accesskey); formData.append("policy", policy); formData.append("signature", signature); // formData.append("x-amz-security-token", token); formData.append("file", file); $.ajax({ url: ''https://mybucket.s3.amazonaws.com'', //Server script to process data type: ''POST'', xhr: function() { // Custom XMLHttpRequest var myXhr = $.ajaxSettings.xhr(); if(myXhr.upload){ // Check if upload property exists myXhr.upload.addEventListener(''progress'',progressHandlingFunction, false); // For handling the progress of the upload } return myXhr; }, //Ajax events beforeSend: function(e) { e.setRequestHeader("Authorization", "AWS "+accesskey+":"+signature); e.setRequestHeader("x-amz-date", xdate); e.setRequestHeader("x-amz-acl", acl); e.setRequestHeader("x-amz-security-token", token); // alert(''Are you sure you want to upload document.''); }, success: function(e) { alert(''Upload completed''); } , error: function(jqXHR, textStatus, errorThrown) { console.log(textStatus); console.log(errorThrown); } , // Form data data: formData, //Options to tell jQuery not to process data or worry about content-type. cache: false, contentType: false, processData: false }); }); }

Mi único html

<form enctype="multipart/form-data"> <input id="file" name="file" type="file" /> <input type="button" value="Upload" /> </form>

Esto es lo que me confundió, al principio dentro del compartimiento tiene una carpeta llamada avatares ahora cuando mi colega subió una imagen (say image1.jpg) usando su email_address (say [email protected]) y la carga es exitosa cuando miramos el cubo creó una carpeta con el nombre de su email_address y dentro de ella la imagen. ¿Porqué es eso?

mybucket/ - avatars/ - [email protected] - image1 - [email protected] - image1 so on ...

las herramientas que utilicé son: webtoolkit.base64.js, sha1.js, base64-binary.js.