内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用
我在服务器端有一个Struts 2操作,用于文件下载。
<action name="download" class="com.xxx.DownAction"> <result name="success" type="stream"> <param name="contentType">text/plain</param> <param name="inputName">imageStream</param> <param name="contentDisposition">attachment;filename={fileName}</param> <param name="bufferSize">1024</param> </result> </action>
但是,当我使用jQuery调用时:
$.post( "/download.action",{ para1:value1, para2:value2 .... },function(data){ console.info(data); } );
在Firebug中,我看到数据是通过二进制流我想知道怎么保存文件到本地?
“将JSON数据发送到服务器并接收Excel文件。此Excel文件由服务器创建,并作为对客户端的响应返回。以自定义名称的文件形式在浏览器中下载该响应。“
$("#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)); });
上面的片段只是在做下面的工作
在这里,我们需要小心地设置服务器端的一些内容。我在PythonDjango HttpResponse中设置了几个头。如果使用其他编程语言,则需要相应地设置它们。
# In python django code response = HttpResponse(file_content, content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
因为我在这里下载了XLS(Excel),所以我将内容类型调整为上面的内容类型。您需要根据您的文件类型设置它。