Est-il possible de télécharger un fichier avec HTTP POST? Je connais la méthode "Get" (windows.location), mais dans mon cas, il y a beaucoup de paramètres à transmettre au serveur
Oui, le reste d'une demande POST peut demander à un navigateur de télécharger un fichier. Le contenu du fichier sera envoyé comme réponse HTTP, comme dans le cas GET.
Tu veux dire comme cela ?
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
Avec ce code serveur:
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");
}
Il semble que vous souhaitiez générer la demande POST à partir de Javascript. Je pense qu'il n'y a aucun moyen de faire en sorte que le navigateur traite le résultat d'une demande AJAX comme un téléchargement. Même si le Content-Type est défini sur quelque chose que les navigateurs proposent normalement en téléchargement (par exemple, "application/octet-stream"), le navigateur ne déposera les données que dans l'objet XMLHttpRequest.
De plus, comme vous le savez probablement déjà, il n'y a aucun moyen de faire que window.open () émette une requête POST.
Je pense que la meilleure façon est de faire une requête AJAX qui génère un fichier sur le serveur. Sur le navigateur, une fois cette demande terminée, utilisez window.open () pour télécharger le fichier généré.
Dans un certain sens, chaque HTTP GET ou POST "télécharge un fichier", mais il vaut mieux le considérer comme la charge utile du message plutôt que comme un fichier. Dans la plupart des cas, la charge utile est un code HTML document que le navigateur doit afficher sous forme de page Web. Mais que se passe-t-il s'il ne s'agit pas d'un document HTML? Que se passe-t-il s'il s'agit d'un fichier Zip pour lequel le navigateur doit offrir à l'utilisateur une boîte de dialogue "Enregistrer sous"? De toute évidence, le navigateur doit déterminer le type de contenu de la réponse et la gérer correctement.
L'un des moyens les plus courants pour un navigateur de déterminer le type de contenu consiste à utiliser un en-tête HTTP appelé, en conséquence, "Content-Type". Cet en-tête prend la valeur d'un type MIME. C'est la clé pour les navigateurs qui font des choses spécifiques au contenu comme lancer un plugin acrobate lorsque la réponse contient un fichier pdf, etc.
Notez que tous les navigateurs 1) ne déterminent pas le type de contenu de la même manière et 2) réagissent au type de contenu de la même manière. Parfois, vous devez jouer avec la définition des en-têtes pour obtenir les comportements que vous souhaitez de tous les navigateurs. Toutes les technologies côté serveur vous permettent de définir des en-têtes HTTP.
Il n'y a aucune différence, à part la méthode de demande et la façon dont vous envoyez les données au serveur. La façon dont vous traitez la réponse est la même, que vous utilisiez GET ou POST.
J'ai réussi à le résoudre en utilisant ceci:
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();
}
Spring Controller Code:
@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();
}