Hoy vamos a ver un poco de Javascript. En este artículo vamos a visualizar como podemos arrastrar y soltar elementos mediante la librería jQuery UI en navegadores modernos y luego realizar una captura de pantalla de los elementos en nuestra página para subir la imagen a nuestro servidor con ASP.NET MVC.
Drag and Drop de jQuery UI
Para iniciar vamos a tener un árbol de navidad y unos regalos a su derecha.
- <div class="inline" id="tree">
- <img src="~/blog/Content/img/tree.png" />
- </div>
- <div class="inline">
- <h2>Regalos de Navidad</h2>
- <div id="gifts">
- <img src="~/blog/Content/img/gift2.gif" />
- <img src="~/blog/Content/img/gift3.gif" />
- <img src="~/blog/Content/img/gift4.gif" />
- <img src="~/blog/Content/img/gift5.gif" />
- <img src="~/blog/Content/img/gift6.gif" />
- </div>
- <a id="shootImage" href="#">Capturar Imagen</a>
- </div>
La idea es que vamos a agarrar los regalos de la lista y los soltaremos en nuestro árbol de navidad. Con jQuery UI es muy fácil realizar esto, permitiendo que de nuestra lista podamos agarrar y soltar un mismo regalo las veces que nosotros deseemos:
- <script type="text/javascript">
- $("#gifts img").draggable({
- helper: 'clone',
- revert: 'invalid',
- containment: 'window',
- appendTo: document.body
- });
Como podemos observar estamos clonando al elemento en el momento de agarrarlo, pero al soltarlo en nuestro árbol este se pierde, por lo cual debemos permitirle al árbol que se inserten los regalos en la posición donde se suelten:
- $("#tree").droppable({
- drop: function (event, ui) {
- //El regalo ha sido arrastrado al arbol
- ui.draggable.clone().appendTo(this).css({ position: "absolute", top: ui.position.top, left: ui.position.left });
- }
- });
Podemos observar como eficazmente soltamos nuestros regalos en el árbol y estos quedan ubicados en esa posición
Ahora haremos una captura de pantalla de nuestro árbol con nuestros regalos para pedírselos al niño Dios. Para esto existe una librería muy buena llamada html2canvas que nos permite mediante Javascript obtener el canvas correspondiente de nuestros elementos en nuestra página web. Y ya con el canvas es muy fácil obtener el Blob (el cuál es una colección de datos binarios que en nuestro caso hacen referencia a nuestra imagen) y mediante un POST subir la imagen a nuestro servidor mediante una Acción de nuestro Controlador.
- function dataURLtoBlob(dataURL) {
- // Decode the dataURL
- var binary = atob(dataURL.split(',')[1]);
- // Create 8-bit unsigned array
- var array = [];
- for (var i = 0; i < binary.length; i++) {
- array.push(binary.charCodeAt(i));
- }
- // Return our Blob object
- return new Blob([new Uint8Array(array)], { type: 'image/png' });
- }
- $("#shootImage").on("click", function (e) {
- e.preventDefault();
- html2canvas($("#tree"), {
- onrendered: function (canvas) {
- // Get our file
- var file = dataURLtoBlob(canvas.toDataURL());
- // Create new form data
- var fd = new FormData();
- // Append our Canvas image file to the form data
- fd.append("NameImage", file);
- // And send it
- $.ajax({
- url: "@Url.Action("FileUpload")",
- type: "POST",
- data: fd,
- processData: false,
- contentType: false,
- }).done(function (response) {
- alert(response);
- });
- }
- });
- });
- </script>
En la Acción de nuestro Controlador únicamente observamos si recibimos el archivo y procedemos a guardarlo en el Servidor de una manera muy fácil.
- [HttpPost]
- public JsonResult FileUpload()
- {
- var file = Request.Files[0];
- if (file != null && file.ContentLength > 0)
- {
- try
- {
- file.SaveAs(HttpContext.Server.MapPath("~/blog/Images/") + "prueba.jpg");
- return Json("La imagen fue guardada con exito!");
- }
- catch (Exception)
- {
- return Json("Ocurrio un error guardando la imagen..");
- }
- }
- else
- {
- return Json("No se pudo guardar la imagen..");
- }
- }
Espero que les haya gustado el ejemplo y una Feliz Navidad! :D
289281e6-78cc-48a3-9687-6addf9dbe815|4|5.0|96d5b379-7e1d-4dac-a6ba-1e50db561b04