即使我的控制器方法中没有错误,我也无法从浏览器下载excel文件。
@RequestMapping(value = "/getExcelFile", method = RequestMethod.GET, produces="application/json")
public @ResponseBody HttpEntity<byte[]> getUserDetailsExcelFile(@RequestParam Long id) {
try {
byte[] wb = ExcelReportView.buildExcelDocument(data);
HttpHeaders header = new HttpHeaders();
header.setContentType(new MediaType("application", "vnd.openxmlformats-officedocument.spreadsheetml.sheet"));
header.set("Content-Disposition",
"attachment; filename=test.xls");
header.setContentLength(wb.length);
return new HttpEntity<byte[]>(wb, header);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
我收到了来自firebug的信息请求。
Request Method:GET Status Code:200 OK
Request Headersview source
Accept:application/json, text/plain, */*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Connection:keep-alive
Cookie:org.cups.sid=ed8f7540d976ccc90b85954f21520861; org.springframework.web.servlet.i18n.CookieLocaleResolver.LOCALE=fr; __ngDebug=true; JSESSIONID=tqi3ofownl17
Host:localhost:8888
Referer:http://localhost:8888/
User-Agent:Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36
X-Requested-With:XMLHttpRequest
Query String Parametersview sourceview URL encoded
id:1
Response Headersview source
Cache-Control:no-cache
Content-Disposition:attachment; filename=test.xls
Content-Length:1849
Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
和回复内容
��A����\p B�a=���=h\:�#8X@�"��1���Arial1���Arial1���Arial1���Arial"$"#,##0_);("$"#,##0)"$"#,##0_); [Red]("$"#,##0) "$"#,##0.00_);("$"#,##0.00)% "$"#,##0.00_);[Red]("$"#,##0.00),*'_(* #,##0_);_(* (#,##0);_(* "-"_);_(@_)5)0_("$"* #,##0_);_("$"* (#,##0);_("$"* "-"_);_(@_)4,/_(* #,##0.00_);_(* (#,##0.00);_(* "-"??_);_(@_)=+8_("$"* #,##0.00_);_("$"* (#,##0.00);_("$"* "-"??_);_(@_)��� � ��� �� ��� �� ��� �� ��� �� ��� �� ��� �� ��� �� ��� �� ��� �� ��� �� ��� �� ��� �� ��� �� ��� �� � � �+�� �� �)�� �� �,�� �� �*�� �� � �� �� ������������������`��
Users Details���c
First Name Last NameEmailPhone AddressLast AppointmentAppointment Status� K ��
d����MbP?_*+��%������"d,,�?�?U���� � �� �v>�@e
所以我不知道该怎么做,我希望浏览器让我选择将文件存放在文件夹中。
谢谢
答案 0 :(得分:1)
派对有点晚了但是......
我猜错误就在这一行:
header.set("Content-Disposition", "attachment; filename=test.xls");
尝试将“附件”更改为“内联”,如下所示:
header.set("Content-Disposition", "inline; filename=test.xls");
答案 1 :(得分:0)
所以我不知道该怎么办,我希望浏览器让我选择 将文件保存在文件夹中。
晚会很晚,但是... 我处于相同的情况:服务器创建了excel,对浏览器的响应还可以,但是没有出现对话框。
问题是我正在执行Ajax呼叫。 如果在新的浏览器窗口中调用excel网址,则可以通过“另存为”对话框下载该网址。
因此,我在html中创建了一个隐藏的<a>
元素,并具有 download html5属性。
然后,在ajax回调中,我设置标签<a>
的 href 属性
最后,我调用 click()函数触发下载。
类似这样的东西:
function openSaveAsDialog(){
var aElement= document.getElementById("aElementId");
aElement.href = "path/to/excel/documentId";
aElement.click();
}
和html
<a id="aElementId" href="path_to_excel" download="filename_to_download" ng-show="false">Download file</a>
希望这会有所帮助。
ps:这个肮脏的解决方案对我有用,但是如果有人可以证明是否有更好的解决方案在没有隐藏的html元素的情况下触发“另存为”对话框,我会很高兴的。