2011-09-27 14 views
15

È possibile scaricare un file con HTTP POST? Conosco il modo "Get" (windows.location), ma nel mio caso ci sono molti parametri che dovrebbero essere passati al serverÈ possibile scaricare un file con HTTP POST?

+0

Questo è il vantaggio del POST, è possibile inviare molti dati (p.es. payload). La sicurezza è anche lì, ma nel tuo caso l'invio di parametri è il requisito. – EMM

risposta

14

Sì, il resto di una richiesta POST può indirizzare un browser per scaricare un file. Il contenuto del file verrebbe inviato come risposta HTTP, come nel caso GET.

3

Non c'è differenza, oltre al metodo di richiesta e alla modalità di invio dei dati al server. Il modo in cui elabori la risposta è lo stesso indipendentemente dal fatto che tu usi GET o POST.

+0

Ciao Greg, puoi fare un esempio?Grazie mille – Sean

4

In un certo senso, ogni HTTP GET o POST sta "scaricando un file", ma è meglio pensarlo come il carico utile del messaggio piuttosto che un file. Nella maggior parte dei casi, il payload è un documento HTML che il browser dovrebbe visualizzare come una pagina web. Ma cosa succede se non è un documento HTML? Cosa succede se si tratta di un file zip per il quale il browser dovrebbe offrire all'utente una finestra di dialogo "Salva come"? Ovviamente, il browser deve stabilire il tipo di contenuto della risposta e gestirlo correttamente.

Uno dei modi più comuni con cui un browser determina il tipo di contenuto è tramite un HTTP header chiamato, di conseguenza, "Content-Type". Questa intestazione prende il valore di un tipo mime. Questa è la chiave per i browser che eseguono contenuti specifici come l'attivazione di un plug-in di acrobat quando la risposta contiene un file pdf, ecc.

Nota, non tutti i browser 1) determinano il tipo di contenuto nello stesso modo e 2) reagiscono al tipo di contenuto nello stesso modo. A volte devi giocare con l'impostazione delle intestazioni per ottenere i comportamenti che desideri da tutti i browser. Tutte le tecnologie lato server consentono di impostare le intestazioni HTTP.

12

Sembra che si desideri generare la richiesta POST da Javascript. Credo che non ci sia modo di ottenere che il browser tratti il ​​risultato di una richiesta AJAX come download. Anche se Content-Type è impostato su qualcosa che i browser normalmente offrono come download (ad esempio "application/octet-stream"), il browser depositerà i dati solo nell'oggetto XMLHttpRequest.

Inoltre, come probabilmente già sapete, non c'è modo di far apparire window.open() una richiesta POST.

Penso che il modo migliore sia creare una richiesta AJAX che generi un file sul server. Nel browser, al termine della richiesta, utilizzare window.open() per scaricare il file generato.

+0

Questa è una delle possibili soluzioni, l'altra sta facendo l'invio del modulo per recuperare il file appropriato. –

11

Intendi questo?

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 questo codice server:

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

Questo è davvero utile, grazie. L'unico problema è che apre una nuova finestra. Potrebbe essere aperto in un iFrame? –

+2

@Menelaos Vergis: aggiungi un alla tua pagina. –

+0

@Quandry: Grazie mille, non so perché questa risposta non abbia ottenuto l'attenzione che merita, funziona come previsto. –

0

sono riuscito a risolverlo utilizzando questo:

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(); 
} 

Codice controller 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(); 
    } 
Problemi correlati