Hola amigos!
Hoy vengo a ayudar a aquel que quiera implementar un sistema de subida de ficheros a Amazon S3 con el método drag&drop de HTML5.
- Para implementar la subida drag&drop de HTML5 usaremos la librería jquery.filedrop.js. Descargarla y poner en vuestra carpeta js… (así como jquery!)
- El bloque de html que contenga el control de subida de ficheros podrá ser algo asi:
<div class="upload" id="uploader">
<h3 class="icono-nube-upload-grande">Subiendo ficheros...</h3>
<ul></ul>
<div>
<span>Arrastra y suelta </span>
</div>
</div>
- Un poquito de CSS:
.upload{
background-color: transparent;
width: 100%;
-webkit-box-sizing: border-box;
padding: 1%;
-moz-box-sizing: border-box;
box-sizing: border-box;
height: 145px;
border-color: #cccccc;
border-width: 7px;
-moz-border-radius: 17px;
-webkit-border-radius: 17px;
border-radius: 17px;
border-style: dashed;
display: inline-block;
position: relative;
}
h3{
margin: 0;
padding: 0;
}
.over{
border-color: #333333;
}
El resultado… (algo así como…)
Subiendo ficheros…
Arrastra y suelta
- Comienza la magia! El script PHP que nos devolverá la URL de Amazon prefirmada y lista para hacer el PUT del fichero; deberéis tener a mano un bucket, la clave privada y pública de Amazon (AWSAccessKeyId y AWSSecretKey)… Si tenéis dudas sobre dónde se obtienen estos datos, preguntadme!
//el nombre del bucket de Amazon al que quieres subir tus ficheros
$bucket = 'mrvision22';
//tiempo en el que va a expirar
$expires = time() + 10000;
//Este fichero lo podrá leer cualquiera (estos permisos se pueden modificar)
$amzHeaders= "x-amz-acl:public-read";
//El nombre del fichero que vamos a subir
$filename = $_GET["filename"];
$mimeType = "";
//esta clave la tenemos que obtener de Amazon
$amazonSecretKey = "xxxx";
//Así como esta... es como la clave pública en una comunicación cifrada con certificado
$AWSAccessKeyId = "xxxxx";
//Se compone la cadena de la petición PUT al REST API de S3
$stringToSign = "PUT\n\n{$mimeType}\n{$expires}\n{$amzHeaders}\n/{$bucket}/$filename";
//Y se firma
$hash = base64_encode(hash_hmac('sha1', $stringToSign, $amazonSecretKey, true));
$sig = urlencode($hash);
$url = urlencode(
"https://{$bucket}.s3.amazonaws.com/{$filename}?AWSAccessKeyId={$AWSAccessKeyId}&Expires={$expires}&Signature={$sig}"
);
echo $url;
- Un breve inciso antes de proseguir… el Bucket de Amazon debe tener configurado el CORS (Cross-Origin Resource Sharing) para permitir el cross-scripting seguro: para el ejemplo permitimos cualquier conexión. Pensad que para que cualquier conexión de subida de ficheros es necesario las claves (y la privada no se la debéis de dar a nadie!)
- Y el javascript! Cargamos en nuestro <head> tanto jQuery como jquery.filedrop.js
(function () {
"use strict";
jQuery(document).ready(function ($) {
$('#uploader').filedrop({
url: '',
withCredentials: false,
requestType : 'PUT',
headers: {
'x-amz-acl': 'public-read',
'Access-Control-Allow-Origin': '*'
},
maxfiles: 25,
maxfilesize: 20,
beforeSend: function (file, i, done) {
$('#uploader ul').append('<li data-index="' + file.name + '">Subiendo <span>' + file.name + '</span></li>');
var that = this;
$.get("script.php", {filename: file.name }, function (data) {
that.url = decodeURIComponent(data);
done();
});
},
uploadFinished: function (i, file, response, time) {
// response is the data you got back from server in JSON format.
$('#uploader ul').find('li[data-index="' + file.name + '"]').css("color", "green");
},
globalProgressUpdated: function (progress) {
// progress for all the files uploaded on the current instance (percentage)
$('#uploader h3').html(progress + "%");
if (progress === 100)
$('#uploader h3').empty();
},
dragOver: function () {
$(this).addClass('over');
},
dragLeave: function () {
$(this).removeClass('over');
},
drop: function () {
$(this).removeClass('over');
}
});
});
})();
Y… listo! Ya tenemos nuestro drag&drop uploader teniendo como repositorio de los ficheros Amazon S3… Cargar vuestro index.html y arrastrar un fichero de una de vuestras carpetas de vuestro PC a esta región… voila! Id a vuestra cuenta de Amazon S3 y allí estará vuestro fichero!
Alguna duda? Dejad en los comentarios!!!
Espero que os sea de ayuda!
Un saludo!
EDIT: Para quien no le guste «copiar y pegar»… aquí tenéis el código del post
Hola Daniel gracias por tu aporte, descargue el script pero no me funciona me puedes colaborar por favor muchas gracias