Загрузка файлов с использованием Java, Struts 2 и AJAX - PullRequest
9 голосов
/ 23 января 2010

Я хочу загрузить файл, используя java, struts2 и ajax.

На моей html-странице есть кнопка с именем «export», нажимая на которую будет выполнен вызов ajax, который выполнит запрос и создаст файл .xls с использованием кода, и я хочу передать этот файл для загрузки пользователю без его сохранения на жестком диске.

Кто-нибудь знает, как это сделать, используя struts2 и ajax в Java?

Есть ли пример?

Дайте мне знать, если вам понадобится более подробная информация от меня ...

Спасибо.

amar4kintu

Ответы [ 6 ]

11 голосов
/ 23 января 2010

В этом случае вам не нужно использовать AJAX. Просто нажмите кнопку, чтобы отправить форму в действие Struts, и используйте действие stream result type.

Пример:

В вашем 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>

Ваше действие предоставит public 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());
2 голосов
/ 20 апреля 2011

Просто для справки, мы можем сделать то же самое, используя аннотацию:

public class MyAction {
    private InputStream fileInputStream;
    private String logoName;

    @Action(value="/downloadLogo", 
        results={
            @Result(name="success", type="stream", 
            params = {
                    "contentType", "application/image/gif",
                    "inputName", "fileInputStream",
                    "contentDisposition", "filename=\"${logoName}\"",
                    "bufferSize", "1024"
            })
        }           
    )    
    public String downloadLogo() throws Exception {
        logoName = "test.jpg";
            fileInputStream = new FileInputStream(new File("DirePath", logoName));
    }
}
2 голосов
/ 29 декабря 2010

В продолжение вопроса amar4kintu относительно файлов, сохраненных как ExportReport.action вместо report.xls, это происходит в IE, если в вашем файле struts.xml не используется следующий формат:

<result name="download" type="stream">
        <param name="contentDisposition">attachment;filename="${flashcardSetBean.title}.xlsx"</param>
        <param name="contentType">application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</param>
        <param name="inputName">inputStream</param>
        <param name="bufferSize">1024</param>
</result>

Кажется, что строка contentDisposition, в частности, должна указывать, что файл является вложением и что имя файла окружено кавычками.

0 голосов
/ 08 мая 2012

Лучший подход к передаче потока к входному потоку объясняется ниже в отличие от ответа ZoogieZork выше

InputStream is = new PipedInputStream();
PipedOutputStream out = new PipedOutputStream((PipedInputStream) is);
wb.write(out);

Преимущество этого метода заключается в том, что весь буфер хранится не в памяти, а скорее по трубопроводу, используя небольшой внутренний кольцевой буфер. Это лучше как с точки зрения памяти, так и с точки зрения загрузки процессора.

Ссылка: Преобразование Java OutputStream в InputStream

0 голосов
/ 29 апреля 2010

Я бы использовал такую ​​аннотацию в классе Action:

@Result(name = "success", type= StreamResult.class,
          params = {"contentType", "application/vnd.ms-excel",
                    "contentDisposition", "attachment; filename=report.xls"},
          value = "reportFileStream"
)
0 голосов
/ 23 января 2010

atlast, я смог решить это следующим образом .. Я написал следующую строку в своей функции класса действий и смог загрузить файл с именем report.xls вместо ExportReport.action. Не знаю точно .. почему?

response.setHeader("Content-Disposition","attachment;filename=rpt.xls"); 

Следующее находится в моем struts.xml файле. Я удалил из него <contentDispositin> param, потому что он не работал из файла 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

...