2011-09-27 16 views
15

¿Es posible descargar un archivo con HTTP POST? Conozco el camino "Get" (windows.location), pero en mi caso, hay una gran cantidad de parámetro que debe ser transmitida al servidor¿Es posible descargar un archivo con HTTP POST?

+0

Esa es la ventaja de POST, puede enviar muchos datos (también conocidos como carga útil). La seguridad también está ahí, pero en su caso el envío de parámetros es el requisito. – EMM

Respuesta

14

Sí, el resto de una solicitud POST puede dirigir un navegador para descargar una archivo. El contenido del archivo se enviará como la respuesta HTTP, igual que en el caso GET.

3

No hay diferencia, aparte del método de solicitud y la forma de enviar datos al servidor. La forma en que procesa la respuesta es la misma independientemente de si usa GET o POST.

+0

Hola Greg, ¿puedes dar un ejemplo?Muchas gracias – Sean

4

En cierto sentido, cada HTTP GET o POST es "descargar un archivo", pero es mejor considerarlo como la carga útil del mensaje en lugar de un archivo. En la mayoría de los casos, la carga útil es un documento HTML que el navegador debe representar como una página web. Pero, ¿y si no es un documento HTML? ¿Qué sucede si se trata de un archivo comprimido para el cual el navegador debe ofrecer al usuario un cuadro de diálogo "Guardar como"? Obviamente, el navegador debe tomar una determinación sobre el tipo de contenido de la respuesta y manejarlo correctamente.

Una de las formas más comunes en que un navegador determina el tipo de contenido es a través de un HTTP header llamado, en consecuencia, "Content-Type". Este encabezado toma el valor de un tipo mime. Esta es la clave para los navegadores que realizan contenido específico, como encender un complemento acrobat cuando la respuesta contiene un archivo pdf, etc.

Nota: no todos los navegadores 1) determinan el tipo de contenido de la misma manera, y 2) reaccionan al tipo de contenido de la misma manera. A veces hay que jugar con configurar los encabezados para obtener los comportamientos que desea de todos los navegadores. Todas las tecnologías del lado del servidor le permiten establecer encabezados HTTP.

12

Parece que desea generar la solicitud POST de Javascript. Creo que no hay forma de que el navegador trate el resultado de una solicitud de AJAX como descarga. Incluso si Content-Type se configura como algo que los navegadores normalmente ofrecerían como descarga (por ejemplo, "application/octet-stream"), el navegador solo depositará los datos en el objeto XMLHttpRequest.

Además, como probablemente ya sepa, no hay forma de que window.open() emita una solicitud POST.

Creo que la mejor manera es hacer una solicitud AJAX que genere un archivo en el servidor. En el navegador, cuando se complete esa solicitud, use window.open() para descargar el archivo generado.

+0

Esta es una de las soluciones posibles, la otra está haciendo la presentación del formulario para recuperar el archivo apropiado. –

11

¿Te refieres a esto?

function IssuePostRequest(objData) 
    { 
     var strPageURL = "about:blank"; 
     var strAction = "@Url.Action("GetPDF", "Home")/"; 
     //var strAction = "/popups/delete.aspx"; 

     var strWindowName = "MyEvilHttpPostInAnewWindow"; // ifrmDownload 
     var iWindowWidth = 805; 
     var iWindowHeight = 625; 



     var form = document.createElement("form"); 
     form.setAttribute("id", "bla"); 
     form.setAttribute("method", "post"); 
     form.setAttribute("action", strAction); 
     form.setAttribute("target", strWindowName); 
     form.setAttribute("style", "display: none;"); 
     // setting form target to a window named 'formresult' 


     // Repeat for all data fields 
     var hiddenField = document.createElement("input"); 
     hiddenField.setAttribute("name", "data"); 
     hiddenField.setAttribute("value", objData); 
     form.appendChild(hiddenField); 
     // End Repeat for all data fields 


     document.body.appendChild(form); 



     // creating the 'formresult' window with custom features prior to submitting the form 
     //window.open(test.html, 'formresult', 'scrollbars=no,menubar=no,height=600,width=800,resizable=yes,toolbar=no,status=no'); 
     //JS_PopupCenterScreen(strPageURL, strWindowName, iWindowWidth, iWindowHeight); 
     window.open(strPageURL, strWindowName); 

     // document.forms[0].submit(); 
     //document.getElementById("xxx").click(); 
     form.submit(); 
    } // End Function IssuePostRequest 

Con este código de servidor:

public FileResult GetPDF(string data) 
    { 
     //data = @"data:image/png;base64,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"; 

     string base64Data = System.Text.RegularExpressions.Regex.Match(data, @"data:image/(?<type>.+?),(?<data>.+)").Groups["data"].Value; 
     byte[] binData = Convert.FromBase64String(base64Data); 

     byte[] ba = PdfHandler.ImageToPdf(binData); 
     //System.IO.File.WriteAllBytes(@"d:\temp\myba.pdf", ba); 

     //return System.Convert.ToBase64String(ba); 
     return File(ba, "application/pdf", "Chart.pdf"); 
    } 
+0

Esto es realmente útil, gracias. El único problema es que abre una nueva ventana. ¿Podría esto abrirse en un iFrame? –

+2

@Menelaos Vergis: Agregue un a su página. –

+0

@Quandry: Muchas gracias, no sé por qué esta respuesta no ha recibido la atención que merece, funciona como se esperaba. –

0

que lograron resolverlo utilizando la siguiente:

service.js

downloadExcel : function() { 
    var mapForm = document.createElement("form"); 
    mapForm.target ="_self"||"_blank"; 
    mapForm.id="stmtForm"; 
    mapForm.method = "POST"; 
    mapForm.action = "your_Controller_URL"; 

    var mapInput = document.createElement("input"); 
    mapInput.type = "hidden"; 
    mapInput.name = "Data"; 
    mapForm.appendChild(mapInput); 
    document.body.appendChild(mapForm); 

    mapForm.submit(); 
} 

código del controlador de primavera:

@Controller 

@PostMapping(value = "/your_Controller_URL") 
    public void doDownloadEmsTemplate(final HttpServletRequest request, final HttpServletResponse response) 
      throws IOException, URISyntaxException { 

     String filePath = "/location/zzzz.xls"; 
     logger.info("Excel Template File Location Path :" + filePath); 
     final int BUFFER_SIZE = 4096; 
     ServletContext context = request.getServletContext(); 
     String appPath = context.getRealPath(""); 
     String fullPath = appPath + filePath; 
     File downloadFile = new File(fullPath); 
     FileInputStream inputStream = new FileInputStream(downloadFile); 
     String mimeType = context.getMimeType(fullPath); 
     if (mimeType == null) { 
      //mimeType = "application/octet-stream"; 
      mimeType = "application/vnd.ms-excel"; 
     } 
     logger.info("MIME type: " + mimeType); 
     response.setContentType(mimeType); 
     response.setContentLength((int) downloadFile.length()); 
     String headerKey = "Content-Disposition"; 
     String headerValue = String.format("attachment; filename=\"%s\"", downloadFile.getName()); 
     logger.info("File Download Successfully : "); 
     response.setHeader(headerKey, headerValue); 
     OutputStream outStream = response.getOutputStream(); 
     byte[] buffer = new byte[BUFFER_SIZE]; 
     int bytesRead = -1; 
     while ((bytesRead = inputStream.read(buffer)) != -1) { 
      outStream.write(buffer, 0, bytesRead); 
     } 
     inputStream.close(); 
     outStream.close(); 
    }