有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Firefox不会将此文件作为CSV下载

我已经尝试了我能想到的一切。我已经更改了100次mime类型。更改了400次标题。我已经看了十几遍了。这在铬上很好用。当我在Firefox中下载时,它认为这是一个xlsx文件,或者是一个二进制文件。它甚至以xlsx的形式打开,但它不认为它是csv,因此列不会分开。如果我保存文件(而不是直接打开),它甚至不会打开扩展名。我甚至还没来得及去,所以这有点让我担心

    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都很好用。还没试过

****编辑****

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


共 (6) 个答案

  1. # 1 楼答案

    回应。AddHeader(“内容处置”,string.Format(“附件;文件名=\”{0}\”,文件名)); 回答ContentType=“text/csv;charset=utf-8”

  2. # 2 楼答案

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

    以后,请确保文件名在标题中有一个引号。这将允许Firefox在需要文件名的情况下正确下载它(无需删除空间之外的任何内容)

    祝你好运

  3. # 3 楼答案

    我不擅长Java/JSP,但你确定这对text/csv正确吗
    回答setHeader(“内容传输编码”、“二进制”);
    你有没有试着评论一下?在PHP中,我只需回显/打印前面带有标题内容类型标题和处置类型的CSV

  4. # 4 楼答案

    添加值为text/csv的内容类型标题

    response.setHeader("Content-type: text/x-csv");
    
  5. # 5 楼答案

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

    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类型不是二进制的

  6. # 6 楼答案

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

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