Firefox не будет загружать этот файл как CSV - PullRequest
8 голосов
/ 01 марта 2011

Я перепробовал все, что мог придумать. Я изменил тип пантомимы 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 1011 * Хорошо, все это время это была проблема пробелов. Мое имя файла было «file name.csv», и это работает во всех браузерах, кроме Firefox. Как только я поместил свое имя файла в "filename.csv без пробелов, он загрузил его, он нашел. Я не заметил, что когда он загружал, он загружал только первую часть имени перед пробелом. Удачи!

Ответы [ 6 ]

6 голосов
/ 25 июля 2012

У меня была та же проблема в PHP, и я обнаружил, что добавление двойных кавычек для имени файла решает проблему.

 response.setHeader("Content-disposition", "attachment; filename=\"" + fileName + \"");
4 голосов
/ 18 марта 2011

Хорошо, все это время это была проблема с пробелами. Мое имя файла было «file name.csv», и это работает во всех браузерах, кроме Firefox. Как только я поместил имя моего файла в «filename.csv без пробелов, он загрузил его, он нашел. Я не заметил, что когда он загружал, он загружал только первую часть имени перед пробелом.

В будущем убедитесь, что имя файла содержит одинарную кавычку в заголовке. Это позволит Firefox загрузить его правильно (без удаления чего-либо за пробелом), если вам нужен пробел в имени файла.

Удачи!

2 голосов
/ 01 марта 2011

Тип содержимого 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()));

Удалите эти заголовки!Длина содержимого в байтах.Не пытайтесь рассчитать это самостоятельно.Это определенно неправильно в этом примере!Mime-Type с основным типом text не является двоичным!

1 голос
/ 25 сентября 2015

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

1 голос
/ 01 марта 2011

Добавить заголовок типа содержимого со значением text / csv

response.setHeader("Content-type: text/x-csv");
0 голосов
/ 01 марта 2011

Я не специалист по Java / JSP, но вы уверены, что это правильно для text / csv?
response.setHeader ("Content-Transfer-Encoding", "binary");
Вы пытались это закомментировать?В PHP я буду просто выводить / выводить CSV с предшествующими заголовками типа содержимого заголовков и типа размещения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...