Me gustaría subir un archivo de forma asincrónica con jQuery.
$(document).ready(function () {
$("#uploadbutton").click(function () {
var filename = $("#file").val();
$.ajax({
type: "POST",
url: "addFile.do",
enctype: 'multipart/form-data',
data: {
file: filename
},
success: function () {
alert("Data Uploaded: ");
}
});
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
<span>File</span>
<input type="file" id="file" name="file" size="10"/>
<input id="uploadbutton" type="button" value="Upload"/>
En lugar de cargar el archivo, solo obtengo el nombre del archivo. ¿Qué puedo hacer para solucionar este problema?
javascript
jquery
ajax
asynchronous
xmlhttprequest
Sergio del Amo
fuente
fuente
Respuestas:
Con HTML5 puede realizar cargas de archivos con Ajax y jQuery. No solo eso, puede hacer validaciones de archivos (nombre, tamaño y tipo MIME) o manejar el evento de progreso con la etiqueta de progreso HTML5 (o un div). Recientemente tuve que hacer un cargador de archivos, pero no quería usar Flash ni Iframes o complementos y después de investigar un poco, encontré la solución.
El HTML:
Primero, puede hacer alguna validación si lo desea. Por ejemplo, en el
.on('change')
caso del archivo:Ahora
$.ajax()
envíe con el clic del botón:Como puede ver, con la carga de archivos HTML5 (y algunas investigaciones) no solo se hace posible, sino que es muy fácil. Pruébelo con Google Chrome, ya que algunos de los componentes HTML5 de los ejemplos no están disponibles en todos los navegadores.
fuente
name="file"
es muy importante en la<input>
etiqueta del archivo si vas a usar los datos en PHP (y probablemente en otros lugares). Creé un formulario dinámicamente usando javascript, por lo que no necesitaba el atributo de nombre, pero descubrí de la manera difícil que lo necesita para recuperar el lado del servidor de datos.Actualización 2019: todavía depende de los navegadores que use su demografía.
Una cosa importante a entender con la "nueva"
file
API HTML5 es que no fue compatible hasta IE 10 . Si el mercado específico al que apunta tiene una propensión superior a la media hacia versiones anteriores de Windows, es posible que no tenga acceso a él.A partir de 2017, aproximadamente el 5% de los navegadores son uno de IE 6, 7, 8 o 9. Si te diriges a una gran corporación (por ejemplo, esta es una herramienta B2B, o algo que estás entregando para entrenamiento) ese número puede dispararse . En 2016, traté con una empresa que usa IE8 en más del 60% de sus máquinas.
Es 2019 a partir de esta edición, casi 11 años después de mi respuesta inicial. IE9 y versiones inferiores están en todo el mundo alrededor de la marca del 1%, pero todavía hay grupos de mayor uso.
Lo importante de esto, cualquiera que sea la función, es verificar qué navegador usan sus usuarios . Si no lo hace, aprenderá una lección rápida y dolorosa de por qué "funciona para mí" no es lo suficientemente bueno como para entregarlo a un cliente. caniuse es una herramienta útil, pero tenga en cuenta de dónde obtienen sus datos demográficos. Es posible que no se alineen con los tuyos. Esto nunca es más cierto que los entornos empresariales.
Mi respuesta de 2008 sigue.
Sin embargo, hay métodos viables que no son JS de carga de archivos. Puede crear un iframe en la página (que oculta con CSS) y luego orientar su formulario para publicar en ese iframe. La página principal no necesita moverse.
Es una publicación "real", por lo que no es totalmente interactiva. Si necesita estado, necesita algo del lado del servidor para procesarlo. Esto varía enormemente dependiendo de su servidor. ASP.NET tiene mejores mecanismos. PHP plain falla, pero puede usar modificaciones de Perl o Apache para solucionarlo.
Si necesita cargar múltiples archivos, es mejor hacer cada archivo de uno en uno (para superar los límites máximos de carga de archivos). Publique el primer formulario en el iframe, controle su progreso utilizando lo anterior y cuando haya terminado, publique el segundo formulario en el iframe, y así sucesivamente.
O use una solución Java / Flash. Son mucho más flexibles en lo que pueden hacer con sus publicaciones ...
fuente
Recomiendo usar el complemento Fine Uploader para este propósito. Tu
JavaScript
código sería:fuente
Nota: Esta respuesta está desactualizada, ahora es posible cargar archivos usando XHR.
No puede cargar archivos usando XMLHttpRequest (Ajax). Puede simular el efecto usando un iframe o Flash. El excelente jQuery Form Plugin que publica sus archivos a través de un iframe para obtener el efecto.
fuente
Terminando para futuros lectores.
Carga asincrónica de archivos
Con HTML5
Puede cargar archivos con jQuery utilizando el
$.ajax()
método si FormData y File API son compatibles (ambas características HTML5).También puede enviar archivos sin FormData, pero de cualquier manera la API de archivos debe estar presente para procesar archivos de tal manera que puedan enviarse con XMLHttpRequest (Ajax).
Para ver un ejemplo rápido y puro de JavaScript ( sin jQuery ), consulte " Envío de archivos con un objeto FormData ".
Retroceder
Cuando no se admite HTML5 (sin API de archivo ), la única otra solución de JavaScript pura (sin Flash ni ningún otro complemento del navegador) es la técnica de iframe oculta , que permite emular una solicitud asincrónica sin usar el objeto XMLHttpRequest .
Consiste en establecer un iframe como el objetivo del formulario con las entradas del archivo. Cuando el usuario envía una solicitud, los archivos se cargan pero la respuesta se muestra dentro del iframe en lugar de volver a representar la página principal. Ocultar el iframe hace que todo el proceso sea transparente para el usuario y emula una solicitud asincrónica.
Si se hace correctamente, debería funcionar prácticamente en cualquier navegador, pero tiene algunas advertencias sobre cómo obtener la respuesta del iframe.
En este caso, puede preferir usar un complemento de envoltura como Bifröst que usa la técnica de iframe pero también proporciona un transporte jQuery Ajax que permite enviar archivos con el
$.ajax()
método de esta manera:Complementos
Bifröst es solo un pequeño contenedor que agrega soporte de respaldo al método ajax de jQuery, pero muchos de los complementos mencionados anteriormente como jQuery Form Plugin o jQuery File Upload incluyen toda la pila de HTML5 a diferentes fallbacks y algunas características útiles para facilitar el proceso. Dependiendo de sus necesidades y requisitos, es posible que desee considerar una implementación simple o cualquiera de estos complementos.
fuente
contentType: false
. Cuando no envié esto con Chrome, el tipo de contenido del formulario fue invalidado por jQuery..done()
y.fail()
. Además, un ejemplo sin el uso deFormData
y una lista de pros / contras sería increíble.TypeError: Argument 1 of FormData.constructor does not implement interface HTMLFormElement.
Este complemento jQuery de carga de archivos AJAX carga el archivo en algún momento y pasa la respuesta a una devolución de llamada, nada más.
<input type="file">
- Use tan poco como -
- o tanto como -
fuente
He estado usando el siguiente script para cargar imágenes que funciona bien.
HTML
JavaScript
Explicación
Utilizo la respuesta
div
para mostrar la animación de carga y la respuesta después de que se realiza la carga.La mejor parte es que puede enviar datos adicionales como identificadores, etc. con el archivo cuando utiliza este script. Lo he mencionado
extra-data
como en el guión.En el nivel de PHP, esto funcionará como carga de archivos normal. los datos adicionales se pueden recuperar como
$_POST
datos.Aquí no estás usando un complemento y esas cosas. Puedes cambiar el código como quieras. No estás codificando ciegamente aquí. Esta es la funcionalidad principal de cualquier carga de archivos jQuery. En realidad Javascript.
fuente
addEventListener
No es un navegador cruzado.Puedes hacerlo en JavaScript vainilla con bastante facilidad. Aquí hay un fragmento de mi proyecto actual:
fuente
ondrop
evento que puede hacervar file = e.dataTransfer.files[0]
Puedes subir simplemente con jQuery
.ajax()
.HTML:
CSS
Javascript:
fuente
La forma más simple y robusta que he hecho en el pasado es simplemente apuntar a una etiqueta iFrame oculta con su formulario; luego se enviará dentro del iframe sin volver a cargar la página.
Es decir, si no desea utilizar un complemento, JavaScript o cualquier otra forma de "magia" que no sea HTML. Por supuesto, puedes combinar esto con JavaScript o lo que tienes ...
También puede leer el contenido del iframe
onLoad
para errores del servidor o respuestas exitosas y luego enviarlo al usuario.Chrome, iFrames y onLoad
-note- solo necesita seguir leyendo si está interesado en cómo configurar un bloqueador de UI al cargar / descargar
Actualmente, Chrome no activa el evento onLoad para el iframe cuando se usa para transferir archivos. Firefox, IE y Edge activan el evento de carga para las transferencias de archivos.
La única solución que encontré que funciona para Chrome fue usar una cookie.
Para hacer eso básicamente cuando se inicia la carga / descarga:
Usar una cookie para esto es feo pero funciona.
Hice un complemento jQuery para manejar este problema para Chrome al descargar, puedes encontrar aquí
https://github.com/ArtisticPhoenix/jQuery-Plugins/blob/master/iDownloader.js
El mismo principio básico se aplica también a la carga.
Para usar el descargador (incluya el JS, obviamente)
Y en el lado del servidor, justo antes de transferir los datos del archivo, cree la cookie
El complemento verá la cookie y luego activará la
onComplete
devolución de llamada.fuente
Una solución que encontré fue tener como
<form>
objetivo un iFrame oculto. El iFrame puede ejecutar JS para mostrar al usuario que está completo (en la carga de la página).fuente
He escrito esto en un entorno Rails . Solo se trata de cinco líneas de JavaScript, si utiliza el ligero plugin jQuery-form.
El desafío es lograr que la carga AJAX funcione, ya que el estándar
remote_form_for
no comprende el envío de formularios de varias partes. No va a enviar los datos del archivo que Rails busca con la solicitud AJAX.Ahí es donde entra en juego el complemento jQuery-form.
Aquí está el código de Rails para ello:
Aquí está el JavaScript asociado:
Y aquí está la acción del controlador Rails, bastante vainilla:
He estado usando esto durante las últimas semanas con Bloggity, y ha funcionado como un campeón.
fuente
Simple Ajax Uploader es otra opción:
https://github.com/LPology/Simple-Ajax-Uploader
Ejemplo de uso:
fuente
IE7+
! Probándolo ahora. GraciasjQuery Uploadify es otro buen complemento que he usado antes para cargar archivos. El código JavaScript es tan simple como el siguiente: código. Sin embargo, la nueva versión no funciona en Internet Explorer.
He buscado mucho y he encontrado otra solución para cargar archivos sin ningún complemento y solo con ajax. La solución es la siguiente:
fuente
Aquí hay otra solución de cómo cargar archivos ( sin ningún complemento )
Usando Javascripts simples y AJAX (con barra de progreso)
Parte HTML
Parte JS
Parte PHP
Aquí está la aplicación EJEMPLO
fuente
Puede usar datos de formulario para publicar todos sus valores, incluidas las imágenes.
fuente
cache: false
es redundante en unaPOST
solicitud ya quePOST
nunca se almacena en caché.TypeError: Argument 1 of FormData.constructor does not implement interface HTMLFormElement.
Para cargar el archivo de forma asincrónica con Jquery, utilice los siguientes pasos:
paso 1 En su proyecto, abra el administrador de Nuget y agregue el paquete (jquery fileupload (solo necesita escribirlo en el cuadro de búsqueda, aparecerá y lo instalará)) URL: https://github.com/blueimp/jQuery-File- Subir
Paso 2 Agregue los siguientes scripts en los archivos HTML, que ya se agregaron al proyecto ejecutando el paquete anterior:
Paso 3 Escriba el control de carga de archivos según el código siguiente:
paso 4 escribe un método js como uploadFile como se muestra a continuación:
Paso 5 En la función Listo, carga el archivo del elemento para iniciar el proceso como se muestra a continuación:
Paso 6 Escriba el controlador MVC y la acción de la siguiente manera:
fuente
Un enfoque moderno sin Jquery es usar el objeto FileList del que obtiene
<input type="file">
cuando el usuario selecciona un archivo (s) y luego usar Fetch para publicar FileList envuelto alrededor de un objeto FormData .fuente
Puede ver una solución resuelta con una demostración funcional aquí que le permite obtener una vista previa y enviar archivos de formulario al servidor. Para su caso, debe usar Ajax para facilitar la carga del archivo al servidor:
Los datos que se envían son datos de formulario. En su jQuery, use una función de envío de formulario en lugar de hacer clic en un botón para enviar el archivo de formulario como se muestra a continuación.
Ver más detalles
fuente
Muestra: si usa jQuery, puede hacer que sea fácil cargar un archivo. Este es un pequeño y fuerte complemento de jQuery, http://jquery.malsup.com/form/ .
Ejemplo
Espero que sea de ayuda
fuente
Puedes usar
Manifestación
fuente
Convierta el archivo a base64 utilizando | ReadAsDataURL () de HTML5 o algún codificador de base64 . Violín aquí
Luego para recuperar:
fuente
Puede pasar parámetros adicionales junto con el nombre del archivo al realizar una carga asincrónica utilizando XMLHttpRequest (sin dependencia de flash e iframe). Agregue el valor del parámetro adicional con FormData y envíe la solicitud de carga.
Además, la carga de archivos Syncfusion JavaScript UI proporciona una solución para este escenario simplemente usando el argumento de evento. puede encontrar documentación aquí y más detalles sobre este control aquí ingrese la descripción del enlace aquí
fuente
Busque Manejar el proceso de carga de un archivo, asincrónicamente aquí: https://developer.mozilla.org/en-US/docs/Using_files_from_web_applications
Muestra del enlace
fuente
Esta es mi solución
y el js
Controlador
fuente
Usando HTML5 y JavaScript , cargar asíncrono es bastante fácil, creo la lógica de carga junto con su html, esto no funciona completamente ya que necesita la API, pero demuestre cómo funciona, si tiene el punto final llamado
/upload
desde la raíz de su sitio web, este código debería funcionar para usted:También alguna información adicional sobre XMLHttpReques:
Para más detalles, puedes seguir leyendo aquí ...
fuente
Puede usar la nueva API Fetch por JavaScript. Me gusta esto:
Ventaja: Fetch API es compatible de forma nativa con todos los navegadores modernos, por lo que no tiene que importar nada. Además, tenga en cuenta que fetch () devuelve una Promesa que luego se maneja mediante el uso
.then(..code to handle response..)
asíncrono.fuente
Puede realizar cargas de archivos múltiples asincrónicos utilizando JavaScript o jQuery y sin utilizar ningún complemento. También puede mostrar el progreso en tiempo real de la carga de archivos en el control de progreso. Me he encontrado con 2 buenos enlaces:
El lenguaje del lado del servidor es C #, pero puede hacer algunas modificaciones para que funcione con otro lenguaje como PHP.
Carga de archivos ASP.NET Core MVC:
En la vista crear control de carga de archivos en html:
Ahora cree un método de acción en su controlador:
La variable hostingEnvironment es de tipo IHostingEnvironment que se puede inyectar al controlador mediante inyección de dependencia, como:
fuente
Para PHP, busque https://developer.hyvor.com/php/image-upload-ajax-php-mysql
HTML
JAVASCRIPT
PHP
fuente
También podría considerar usar algo como https://uppy.io .
Realiza la carga de archivos sin navegar fuera de la página y ofrece algunas bonificaciones como arrastrar y soltar, reanudar las cargas en caso de fallas del navegador / redes inestables e importar desde, por ejemplo, Instagram. Es de código abierto y no depende de jQuery / React / Angular / Vue, pero se puede usar con él. Descargo de responsabilidad: como su creador soy parcial;)
fuente