2011-09-28 66 views
9

Mi pregunta es similar a Download and open pdf file using AjaxjQuery Ajax llamado a archivo PDF descarga

Pero no es exactamente el mismo, la razón por la que quiero una ajax jQuery es que mi archivo se genera dinámicamente a partir de los datos que se obtengan de la misma página.

Así que, básicamente, tengo un objeto Json que debe enviarse al servidor que generará dinámicamente un archivo y lo enviará de vuelta al navegador.

No me gustaría utilizar cadenas de consulta en un anclaje con mi objeto Json stringyfied, ya que creo que sería una amenaza potencial ya que las cadenas de consulta tienen restricciones de caracteres (¿estoy aquí?).

Háganme saber Si mi flujo de trabajo es correcto o puedo lograr lo mismo con un flujo diferente.

Respuesta

8

No debe usar AJAX para descargar archivos. Esto no funciona Esto se dice que se quedan con 2 opciones: enlace y de cadena de consulta parámetros

  1. de acción o si la descarga se debe trigerred en algún evento javascript específica también se puede establecer el window.location.href a la acción que se supone que debe generar el Archivo PDF y parámetros de cadena de consulta de paso.

  2. o si usted tiene miedo de que usted tiene un montón de datos para pasar a la acción del controlador que va a generar el PDF para descargar utiliza un <form> con method="POST" y en su interior se utiliza campos ocultos para almacenar la mayor cantidad de parámetros y datos que se como:

    @using (Html.BeginForm("download", "home")) 
    { 
        ... hidden fields containing values that need to be sent to the server 
        <input type="submit" value="Download PDF" /> 
    } 
    
+0

Darin: ¿qué piensas acerca de generar el archivo en el servidor con una solicitud AJAX GET? Esto me permite detectar cualquier error que ocurra en el servidor durante la generación del archivo en la devolución de llamada fallida y mostrarlo al usuario. Si tiene éxito, paso el nombre de archivo en la devolución de llamada de éxito de ajax y hago 'window.location = server \ folder \ filename'. Estoy trabajando con ASP.NET Web API aquí. –

+0

OP pidió específicamente ajax. Esto es un desperdicio de ancho de banda. – CodeWarrior

+0

@OmarPadilla, no puede descargar archivos usando AJAX al cliente.Pero incluso si eso fuera posible, habría desperdiciado exactamente la misma cantidad de ancho de banda que si hubiera usado un enlace directo para descargar el archivo. La razón simple de esto es que en ambos casos está llamando al mismo punto final en el servidor que está devolviendo el mismo archivo. Y no se deje engañar por pensar que si no usa AJAX, la página actual * recargará *. No hay solicitudes adicionales aparte de la acción del controlador que transmitirá el archivo. –

1

en lugar de hacer una llamada más ajax en su página se puede utilizar etiqueta de anclaje y la fuerza php descarga para llevar a cabo pdf descarga

HTML 
    <a href="www.example.com/download_file.php?file_source=example.pdf">Download pdf here</a> 

PHP 
<?php 
$fullPath = $_GET['fileSource']; 
if($fullPath) { 
    $fsize = filesize($fullPath); 
    $path_parts = pathinfo($fullPath); 
    $ext = strtolower($path_parts["extension"]); 
    switch ($ext) { 
     case "pdf": 
     header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\""); // use 'attachment' to force a download 
     header("Content-type: application/pdf"); // add here more headers for diff. extensions 
     break; 
     default; 
     header("Content-type: application/octet-stream"); 
     header("Content-Disposition: filename=\"".$path_parts["basename"]."\""); 
    } 
    if($fsize) {//checking if file size exist 
     header("Content-length: $fsize"); 
    } 
    readfile($fullPath); 
    exit; 
} 
?> 

estoy comprobando para el tamaño del archivo porque si se carga el pdf de CDN CloudFront, que ganó el `t consigue el tamaño del documento que obliga el documento para descargar en 0kb, Para evitar esto estoy comprobando con esta condición

if($fsize) {//checking if file size exist 
     header("Content-length: $fsize"); 
    } 

Yo también estaba luchando con este problema, el código anterior funcionó para mí Espero que ayude

+2

Buena respuesta, aunque no es realmente relevante, dada la etiqueta ASP.NET. – porjolovsky

+0

Gracias @porjolovsky – Hitesh

0

Tengo una respuesta muy segura. No puede descargar archivos PDF mientras usa la solicitud ajax al servidor. Entonces, en lugar de eso, debes usar html actionlink. por ejemplo

@Html.ActionLink("Convert Data into PDF", "PDFView", null, new { @class= "btn btn-info" }); 

El código anterior generará un botón de enlace y puede acceder al Método de acción del controlador. También puede utilizar cualquier técnica para devolver un archivo PDF desde el controlador, por ejemplo, puede devolver el archivo PDF usando FileResult clase.

Cuestiones relacionadas