J'essaie d'exporter les données de ma page Web et de les télécharger en tant que fichier Excel. mais le téléchargement ne commence pas, même si le retour de la réponse a abouti.
$.ajax({
type: "POST",
url: _url,
contentType: 'multipart/form-data;boundary=SzB12x',
data: json,
});
Le responseText ressemble à ceci:
PK J; F? Xl/theme/theme1.xml YOo 6 , [r n; v i # - kJH: oC {0X7�2
mZ���d��u@�(٦b:M����
{| ^ 0t @ * "w $ ! 0I [՚ n i ' iH g, | J?!? HRh h ? R & L ߶ S v @ ? # ? "} Жt% hR t" + ? u {ނ 0 K oy 9OT WywkAͯ F 6 * [ U
Je pense que c'est le fichier mais je ne peux pas le télécharger!
Toute aide s'il vous plaît?
Merci!
J'ai fait face au même problème et l'ai résolu avec succès. Mon cas d'utilisation est le suivant.
Code:
$("#my-button").on("click", function() {
// Data to post
data = {
ids: [1, 2, 3, 4, 5]
};
// Use XMLHttpRequest instead of Jquery $ajax
xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
var a;
if (xhttp.readyState === 4 && xhttp.status === 200) {
// Trick for making downloadable link
a = document.createElement('a');
a.href = window.URL.createObjectURL(xhttp.response);
// Give filename you wish to download
a.download = "test-file.xls";
a.style.display = 'none';
document.body.appendChild(a);
a.click();
}
};
// Post data to URL which handles post request
xhttp.open("POST", excelDownloadUrl);
xhttp.setRequestHeader("Content-Type", "application/json");
// You should set responseType as blob for binary responses
xhttp.responseType = 'blob';
xhttp.send(JSON.stringify(data));
});
L'extrait ci-dessus ne fait que suivre
Ici, nous devons définir soigneusement quelques éléments côté serveur. J'ai mis quelques en-têtes dans Python Django HttpResponse. Vous devez les configurer en conséquence si vous utilisez d'autres langages de programmation.
# In python Django code
response = HttpResponse(file_content, content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
Depuis que je télécharge xls (Excel) ici, j’ai ajusté contentType à la valeur précédente. Vous devez le définir en fonction de votre type de fichier.
Essayez d'utiliser un formulaire masqué pour soumettre la demande.
Lorsqu'un utilisateur soumet un formulaire HTML, toutes les données saisies dans le formulaire par l'utilisateur sont envoyées sous forme de requête GET ou POST à l'URL spécifiée dans l'attribut «ACTION» de FORM.
<FORM action="http://www.labnol.org/sendmail.php" method="post">
...form contents...
</FORM>
Dans l'exemple ci-dessus, une demande HTTP POST est envoyée au script sendmail.php lors de la soumission du formulaire. Vous pouvez ajouter target = ”_ blank” à la balise FORM pour traiter la demande dans une nouvelle fenêtre.
Toutefois, si vous souhaitez envoyer un FORMULAIRE sur la page en arrière-plan sans diriger le navigateur vers une autre page (document.location.href change lors de l'envoi du formulaire), vous avez deux options:
Option 1. Vous pouvez créer un IFRAME invisible dans votre page HTML et le définir comme cible pour le FORMULAIRE original. Cela soumettra le formulaire mais sans recharger la fenêtre parente.
<FORM action="http://example.com/script.php"
method="POST" target="hidden-form">
...form contents...
</FORM>
<IFRAME style="display:none" name="hidden-form"></IFRAME>
Option n ° 2: une autre méthode vous permet de créer des charges personnalisées avant de soumettre le formulaire. Contrairement à la soumission de formulaire basée sur IFRAME, le code suivant crée une demande de soumission de formulaire standard. Par conséquent, l'emplacement de votre navigateur change et la page actuelle est ajoutée à l'historique du navigateur. Crédit: Rakesh Pai.
submitFORM('http://example.com/script.php', 'POST',
{'name':'digital+inspiration', 'age':'100', 'sex','M'});
function submitFORM(path, params, method) {
method = method || "post";
var form = document.createElement("form");
form.setAttribute("method", method);
form.setAttribute("action", path);
//Move the submit function to another variable
//so that it doesn't get overwritten.
form._submit_function_ = form.submit;
for(var key in params) {
if(params.hasOwnProperty(key)) {
var hiddenField = document.createElement("input");
hiddenField.setAttribute("type", "hidden");
hiddenField.setAttribute("name", key);
hiddenField.setAttribute("value", params[key]);
form.appendChild(hiddenField);
}
}
document.body.appendChild(form);
form._submit_function_();
}
Dans this _ link, vous pouvez trouver le moyen de créer un formulaire masqué et de le soumettre.
prendre plaisir!!
Approche ici directement levée de https://Gist.github.com/DavidMah/3533415
Cette approche utilise <form>
et ajoute les données avec une clé. Cette approche fonctionne si le serveur attend déjà les données en tant qu'attribut du corps de la demande, par opposition au corps de la demande lui-même. Si les données à télécharger sont un objet, vous pouvez effectuer une itération sur les clés de cet objet. Si les données à télécharger sont un tableau, modifiez la route du serveur ou [ajoutez une idée ici].
// Takes a URL, param name, and data string
// Sends to the server.. The server can respond with binary data to download
jQuery.download = function(url, key, data){
// Build a form
var form = $('<form></form>').attr('action', url).attr('method', 'post');
// Add the one key/value
form.append($("<input></input>").attr('type', 'hidden').attr('name', key).attr('value', data));
//send request
form.appendTo('body').submit().remove();
};
# A Tidbit of sinatra code to respond
# Assume url is a set variable
# Assume 'key' is the key of the value used in the javascript
post url do
data = params[:key]
puts request.body.read
headers['Content-Type'] = "application/octet-stream"
body(data)
end
$.download('/path/resource/, 'data', JSON.stringify(data))
Si vous souhaitez simplement télécharger un fichier, vous n'avez pas besoin d'utiliser ajax pour le faire. En fait, vous ne pouvez pas télécharger le fichier en utilisant ajax.
Vous pouvez toujours le faire en effectuant une demande de lien hypertexte <a href="your_link">Export</a>
vers une page de serveur indiquant que réponses content-type
est application/vnd.ms-Excel
et content-disposition
est attachment
.