Я перепробовал все, что мог придумать. Я изменил тип пантомимы 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 без пробелов, он загрузил его, он нашел. Я не заметил, что когда он загружал, он загружал только первую часть имени перед пробелом. Удачи!