Firefox不会将此文件下载为CSV格式

时间:2011-03-01 14:50:50

标签: java servlets csv

我已经尝试了所有我能想到的东西。我已经改变了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> 

我尝试过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();
            }
        }

感谢您的帮助。

Safari,Opera和Chrome工作正常。没试过IE。

**** **** EDIT

好的这整个时间都是间距问题。我的文件名是“file name.csv”,这适用于除firefox之外的所有浏览器。很快,当我把我的文件名设置为“filename.csv没有空格时,它就下载了它。我没有注意到它在下载时只是在空格之前下载了名字的第一部分。祝你好运!

6 个答案:

答案 0 :(得分:6)

我在PHP中遇到了同样的问题,发现为文件名添加双引号可以解决问题。

 response.setHeader("Content-disposition", "attachment; filename=\"" + fileName + \"");

答案 1 :(得分:4)

好的这整个时间都是间距问题。我的文件名是“file name.csv”,这适用于除firefox之外的所有浏览器。很快我将文件名设置为“filename.csv,没有下载的空格就找到了。我没有注意到它在下载时只是在空格之前下载了名称的第一部分。

将来确保文件名在标题中有一个单引号。如果您需要一个空格的文件名,这将允许Firefox正确下载(不会剥离任何空间)。

祝你好运!

答案 2 :(得分:2)

内容类型text / csv是正确的,但您还应添加charset编码:

response.setHeader("Content-type: text/csv; charset=utf-8");

但到底是什么:

response.setHeader("Content-Transfer-Encoding", "binary");
response.setHeader("Content-length", String.valueOf(stringList.size()));

删除标题!内容长度以字节为单位。不要试图自己计算。在这个例子中肯定是错误的!主要类型text的Mime类型不是二进制!

答案 3 :(得分:1)

使用值text / csv

添加内容类型标头
response.setHeader("Content-type: text/x-csv");

答案 4 :(得分:1)

Response.AddHeader(“content-disposition”,string.Format(“attachment; filename = \”{0} \“”,fileName)); Response.ContentType =“text / csv; charset = utf-8”;

答案 5 :(得分:0)

我不是Java / JSP的专家,但你确定这对text / csv是正确的吗? response.setHeader(“Content-Transfer-Encoding”,“binary”);
你有没有尝试评论这个?在PHP中,我将简单地回显/打印带有标题内容类型标题和处置类型的CSV。