2012-03-27 65 views
9

Tengo una solicitud de ajax en mi servidor donde estoy creando un archivo PDF. Ahora quiero mostrar este archivo en una nueva ventana/pestaña o simplemente descargarlo. ¿Cómo puedo hacer eso?return PDF in ajax request

mi solicitud

$.ajax({ 
    url: '/Document/CreatePDF', 
    type: 'POST', 
    data: { 
     docid: documentId, 
     dataId: array 
    }, 
    traditional: true, 
    success: function (data) { 
    } 
}); 

    [HttpPost] 
    public FileStreamResult CreatePDF(long docid, List<long> dataId) 
    { 
     var document = _rep.LoadDocument(docid.ToString(), Server.MapPath("~/Documents/") + docid + ".xml"); 

     var exporter = new PDFExporter(document); 

     MemoryStream fileStream = exporter.CreatePDF(); 
     byte[] PdfByte = fileStream.GetBuffer(); 
     fileStream.Flush(); 
     fileStream.Close(); 

     HttpContext.Response.AddHeader("content-disposition","attachment; filename=form.pdf"); 

     return new FileStreamResult(fileStream, "application/pdf"); 
    } 
+0

Creo que debe enviar un formulario normal al servidor o devolver una dirección al documento pdf creado al que el Javascript puede reenviar el navegador en una nueva ventana ... –

+0

Solución general: Esto funcionó para mí (PDF diálogo modal desde un byte [] a través de una llamada MVC-ajax) kamgman

Respuesta

12

No puede utilizar AJAX para descargar archivos. El motivo es que javascript no le permite guardar el contenido descargado en la computadora cliente, ni solicitar un cuadro de diálogo Guardar como. Debe utilizar un simple HTML <form> o un ancla:

@using (Html.BeginForm("CreatePDF", "Document", FormMethod.Post, new { id = "myform" })) 
{ 
    <button type="submit">Download</button> 
} 

Si necesita pasar argumentos a esta acción del controlador que son conocidos sólo en el cliente puede suscribirse a la .submit caso de esta forma y luego dinámicamente inyectar oculta campos en él con los valores correspondientes y luego dejar la acción predeterminada ejecutar. Y si los valores se conocen del lado del servidor, simplemente debe usar ayudantes de HTML para generar esos campos ocultos.

+0

@ Derin Dimitrov ¿Algún buen ejemplo de usar un ancla? –