È 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?
risposta
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.
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.
Ciao Greg, puoi fare un esempio?Grazie mille – Sean
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.
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.
Questa è una delle possibili soluzioni, l'altra sta facendo l'invio del modulo per recuperare il file appropriato. –
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");
}
Questo è davvero utile, grazie. L'unico problema è che apre una nuova finestra. Potrebbe essere aperto in un iFrame? –
@Menelaos Vergis: aggiungi un alla tua pagina. –
@Quandry: Grazie mille, non so perché questa risposta non abbia ottenuto l'attenzione che merita, funziona come previsto. –
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();
}
- 1. Post Http con indy
- 2. Http POST è illimitato?
- 3. symfony2: usando assetic-dump, è possibile scaricare un solo file?
- 4. È possibile memorizzare nella cache i metodi POST in HTTP?
- 5. Scaricare un file con JSF?
- 6. Quanto è sicuro un POST HTTP?
- 7. Come scaricare una risorsa HTTP in un file con Akka Streams e HTTP?
- 8. È possibile pianificare i post con Jekyll?
- 9. Come scaricare più file con una richiesta HTTP?
- 10. È possibile determinare la dimensione del file da scaricare?
- 11. Scaricare un file con password e nome utente con C#
- 12. Come posso scaricare un file su HTTP usando Ruby?
- 13. È possibile rimuovere alcuni dati di post con un HttpModule?
- 14. È possibile scaricare JavaScript caricato dinamicamente?
- 15. Caricamento di più file tramite http POST
- 16. post http con formica per il caricamento di file
- 17. Http POST in Java (con upload di file)
- 18. È possibile caricare su S3 direttamente dall'URL utilizzando il POST?
- 19. REST - HTTP Post Multipart con JSON
- 20. Invio di POST HTTP con System.Net.WebClient
- 21. Invio di un file tramite POST utilizzando HTTP grezzo (Putty)
- 22. Post HTTP multipartito Apache Camel (caricamento file)
- 23. Come scaricare un file con AFNetworking 2.0
- 24. Non scaricare un file esistente con axel
- 25. HTTP POST utilizzando Angular.js
- 26. È possibile scaricare versioni precedenti notturne?
- 27. è possibile in Elixir effettuare una richiesta HTTP POST spingendo alcuni dati su un URL esterno?
- 28. È sicuro un POST da HTTP a HTTPS?
- 29. È possibile utilizzare Content-Encoding: gzip in una richiesta HTTP POST?
- 30. generare un file con django da scaricare con javascript/jQuery
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