我已经尝试了我能想到的一切.我已经改变了mime类型100次.将标题更改了400次.我已经看了几十次堆栈.这在Chrome中运行良好.我在Firefox下载后很快就会认为它是xlsx文件或二进制文件.它甚至作为xlsx打开,但它不认为它是一个csv所以列不是分开的.如果我保存文件(而不是只打开),它甚至没有打开扩展名.我还没有进入IE,所以这让我很担心.
mime mapping
<mime-mapping>
<extension>csv</extension>
<mime-type>application/vnd.ms-excel</mime-type>
</mime-mapping>
Run Code Online (Sandbox Code Playgroud)
我试过text/csv,application/csv,application/binary,application/octet-stream.
public void doDownloadFile() {
PrintWriter out = null;
try {
String fileName = selectedPkgLine.getShortname() + ".csv";
HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
response.setHeader("Pragma", "public");
response.setHeader("Expires", "0");
response.setContentType(request.getServletContext().getMimeType(fileName));
response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
response.setHeader("Content-disposition", "attachment; filename=" + fileName + "");
response.setHeader("Content-Transfer-Encoding", "binary");
out = response.getWriter();
CSVWriter writer = new CSVWriter(out);
List<PkgLoad> pkgLoadList = pkgLoadService.findBetweenDates(selectedPkgLine, startDate, endDate);
List<String[]> stringList = new ArrayList<String[]>();
stringList.clear();
String[] header = {
"pkg_load_id",
"time_stamp",
"ounces",
"revolutions",
"wrap_spec_id",
"pkg_line_id"
};
stringList.add(header);
for (PkgLoad pkgLoad : pkgLoadList) {
String[] string = {
pkgLoad.getPkgLoadId().toString(),
pkgLoad.getTimeStamp().toString(),
pkgLoad.getOunces().toString(),
pkgLoad.getRevolutions().toString(),
pkgLoad.getWrapSpecId().getWrapSpecId().toString(),
pkgLoad.getPkgLineId().getPkgLineId().toString()
};
stringList.add(string);
}
response.setHeader("Content-length", String.valueOf(stringList.size()));
writer.writeAll(stringList);
out.flush();
} catch (IOException ex) {
Logger.getLogger(ViewLines.class.getName()).log(Level.SEVERE, null, ex);
} finally {
out.close();
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助.
Safari,Opera和Chrome工作得很好.没试过IE.
好这整个时间都是间距问题.我的文件名是"file name.csv",这适用于除firefox之外的所有浏览器.很快我将文件名设置为"filename.csv,没有空格就下载了它.我没有注意到它在下载时只是在空格之前下载了名字的第一部分.祝你好运!
小智 6
我在PHP中遇到了同样的问题,发现为文件名添加双引号可以解决问题.
response.setHeader("Content-disposition", "attachment; filename=\"" + fileName + \"");
Run Code Online (Sandbox Code Playgroud)
内容类型 text/csv 是正确的,但您还应该添加字符集编码:
response.setHeader("Content-type: text/csv; charset=utf-8");
Run Code Online (Sandbox Code Playgroud)
但这到底是什么:
response.setHeader("Content-Transfer-Encoding", "binary");
response.setHeader("Content-length", String.valueOf(stringList.size()));
Run Code Online (Sandbox Code Playgroud)
删除该标题!内容长度以字节为单位。不要尝试自己计算。在这个例子中它绝对是错误的!具有主要类型的 Mime-Typetext不是二进制的!
好吧,这一直是一个间距问题。我的文件名是“文件名.csv”,这适用于除 Firefox 之外的所有浏览器。当我将我的文件名放入“filename.csv”时,它会下载它,但没有空格。我没有注意到,当它下载时,它只下载了空格之前的名称的第一部分。
将来请确保文件名在标题中带有单引号。如果您的文件名需要空格,这将允许 Firefox 正确下载它(不会删除空格后面的任何内容)。
祝你好运!
| 归档时间: |
|
| 查看次数: |
13277 次 |
| 最近记录: |