2010-08-31 17 views
8

Así que sé que ha habido una serie de similar mensajes, pero creo que esto es suficiente de una variación para justificar su propia pregunta:PHP Descargar archivo usando datos POST a través de jQuery AJAX

Estoy construyendo un exportador XLS en PHP y jQuery. Estoy intentando PUBLICAR una matriz con jQuery (que creo que va a ser demasiado larga como una cadena de consulta GET) y usarla para generar un archivo XLS en mi servidor, que luego el usuario puede descargar.

He utilizado iframes ocultos en el pasado para lograr esto, pero como solo redirigen a una url, esto requiere que use GET, lo que me pone nervioso.

Mi pregunta es: ¿cómo puedo almacenar esos archivos en mi servidor y vincularlos si están siendo generados dinámicamente, potencialmente por múltiples usuarios? ¿Un enlace iframe oculto a un script PHP separado que localiza su archivo basado en un ID de sesión o algo así?

Gracias de antemano por cualquier orientación aquí en lo que yo estoy seguro Obtiene preguntan todo el tiempo :)

Respuesta

9

Es posible enviar a un iframe oculto. Por lo tanto, no necesita preocuparse por la longitud de la cadena de consulta; publicará los pares clave/valor que generarán su archivo XLS y forzarán posteriormente la descarga del archivo al navegador.

<form method="post" action="/download/xls" target="download_xls"> 
    <fieldset> 
    <label>Key 1:</label> 
    <input type="text" name="key_1" /> 
    </fieldset> 

    <fieldset> 
    <label>Key 2:</label> 
    <input type="text" name="key_2" /> 
    </fieldset> 

    <fieldset> 
      <input type="submit" value="Submit" /> 
    </fieldset> 
</form> 

<iframe id="download_xls" name="download_xls" width="0" height="0" scrolling="no" frameborder="0"></iframe> 

ACTUALIZACIÓN Una rápida búsqueda en Google nos salió este artículo: http://particletree.com/notebook/ajax-file-download-or-not/

Básicamente, la sugerencia es publicar su formulario de la página actual y responder con un archivo de descarga. Esta alternativa podría ser lo suficientemente buena para ti.

+0

Muy buena idea, pero desafortunadamente, el atributo objetivo está obsoleto en los elementos del formulario, por lo que no sé si esa sería una solución segura. – Trafalmadorian

+0

Fascinante. Voy a intentarlo ahora mismo ... si funciona, aceptaré tu respuesta :) – Trafalmadorian

+0

Estás en lo correcto. Está en desuso en HTML 4.1 y XHTML 1.0. Sin embargo, es válido en XHTML 1.0 Transitional, y todavía es compatible con la mayoría de los principales navegadores. http://www.w3schools.com/TAGS/att_form_target.asp – simeonwillbanks

5

Esta parece que debería ser bastante simple, pero todo depende de dónde se está poniendo esos archivos XLS estás generando Si tiene la intención de que la respuesta a la publicación sea un cuadro de diálogo "Guardar archivo" —, es decir, el archivo en sí —, entonces todo lo que tiene que hacer es asegurarse de que el encabezado "Content-Disposition" esté configurado como "archivo adjunto" ", y luego transmitir el contenido del archivo.

Si va a generar el archivo y no perderlo, tendrá que guardarlo en algún lugar con un identificador. En ese caso, simplemente respondería con una página común que tiene un enlace de "descarga", de modo que ese enlace incluya el identificador de archivo. Eso puede desencadenar un GET o un POST, y el servidor respondería al que prácticamente como he descrito anteriormente.

Un oculto realmente no figura en esto, en mi opinión.

+0

Muchas gracias por la respuesta. Idealmente, no los mantendría cerca y simplemente vincularía al usuario con un cuadro de diálogo "Guardar archivo". Sin embargo, si hago eso, primero tengo que enviar los datos desde su cliente y generar el archivo DESDE esos datos, y volver a vincularlos ... lo que parece que me obligaría a mantenerlo en el servidor una vez que haya sido procesado. generado. Lógica circular, lo sé :) – Trafalmadorian

Cuestiones relacionadas