#java #excel #spring-mvc #download
#java #excel #spring-mvc #Скачать
Вопрос:
Есть ли какой-нибудь трюк для получения пользовательского представления SpringMVC, вызывающего загрузку файла в broswer? Я реализовал render
метод из org.springframework.web.servlet.View
, но в результате кода мои данные записываются на страницу в виде большого двоичного объекта данных, а не запускается действие загрузки.
try {
Document oDoc = (Document) model.get("oDoc");
out = new PrintWriter(response.getOutputStream());
response.setContentType("application/vnd.ms-excel");
response.setHeader("content-disposition", "attachment; filename=file.xls");
GenerateXLSFile gof = new GenerateXLSFile();
gof.outputTSVFromDom(out, oDoc);
} catch block here {
//writes to log here
} finally {
if (out != null) {
out.flush();
out.close();
}
}
Я знаю, что метод визуализации вызывается из журналов сервера. Я знаю, что файл GenerateXLSFile создается из журналов сервера. Я знаю, что outputTSVFromDom может взять документ и преобразовать его в работу из моего теста JUnit. Оно также записывается в журнал сервера и завершается. Данные заканчиваются в браузере. HTTP-заголовки выглядят нормально в соответствии с firebug. В журнале сервера нет ошибок из блока catch.
Чего мне здесь не хватает?
Комментарии:
1. Вы пробовали возиться с типом контента, чтобы посмотреть, что произойдет, если вы измените его на что-то другое (которое также должно быть загружаемым), например application / octet-stream?
2. Попробуйте
out = response.getWriter();
Ответ №1:
Прежде всего, какой API вы используете? Документы Excel являются двоичными, поэтому вам следует использовать OutputStream, а не Writer.
Во-вторых, Spring имеет встроенную поддержку для обслуживания документов Excel:
- AbstractExcelView, основанный на API Apache POI
- AbstractJExcelView, основанный на API JExcel
Комментарии:
1. было проще переписать это для использования AbstractExcelView, чем сохранить неуклюжий старый код со значением табуляции.