Я хочу дать загрузку файла, используя Яву, struts2 и ajax.
На моей странице HTML есть кнопка, названная «экспортным» нажатием, какой звонок ajax будет сделан, который выполнит вопрос и создаст .xls файл, используя код, и я хочу дать тот файл для загрузки пользователю, не храня его на жестком диске.
Кто-либо знает, как сделать то использование struts2 и ajax на Яве?
Действительно ли там какой-либо пример доступен?
Сообщите мне, нужно ли Вам больше деталей от меня...
Спасибо.
amar4kintu
В этом случае не обязательно использовать AJAX. Просто попросите кнопку отправить форму в ваше действие Struts, и пусть действие использует тип -результат потока.
Пример:
В вашем действии Struts XML:
<result name="download" type="stream">
<param name="contentDisposition">attachment;filename=report.xls</param>
<param name="contentType">application/vnd.ms-excel</param>
<param name="inputName">inputStream</param>
<param name="bufferSize">1024</param>
</result>
Ваше действие предоставит публичный InputStream getInputStream()
для передачи данных.
Я предполагаю, что любая библиотека, которую вы используете для генерации Excel файлов (POI?) может записать вывод в произвольный OutputStream
.
Быстрый и грязный способ преобразовать это в InputStream
:
// Using Workbook from Apache POI for example...
Workbook wb;
// ...
ByteArrayOutputStream bos = new ByteArrayOutputStream();
wb.write(bos);
InputStream bis = new ByteArrayInputStream(bos.toByteArray());
атлас, я смог решить его следующим образом...
Я написал следующую строку в своей функции класса действия и смог скачать файл с именем report.xls
вместо ExportReport.action
. Почему я точно не знаю?
response.setHeader("Content-Disposition","attachment;filename=rpt.xls");
Следующее находится в моем файле struts.xml
. Я удалил из него параметр
, потому что он не работал из файла struts.xml
, и поместил его в свой Java-файл, как описано выше.
<result name="success" type="stream" >
<param name="inputName">fileStream</param>
<param name="contentType">application/vnd.ms-excel</param>
<param name="bufferSize">1024</param>
</result>
Надеюсь, это кому-нибудь поможет.
Спасибо.
amar4kintu
Я бы использовал такую аннотацию для класса Action:
@Result(name = "success", type= StreamResult.class,
params = {"contentType", "application/vnd.ms-excel",
"contentDisposition", "attachment; filename=report.xls"},
value = "reportFileStream"
)