Как записать объект файла в ответ сервера и без сохранения файла на сервере? - PullRequest
2 голосов
/ 14 сентября 2011

Я использую Spring с DWR.Я хочу вернуть файловый объект в качестве ответа, однако я сохраняю файл (для отправки) во временном местоположении сервера, а затем отправляю его местоположение в виде href для тега привязки на стороне клиента, однако мне интересно, можно ли было бы выкинутьфайл напрямую в браузер на объекте ответа без временного сохранения его на сервере.

Я ожидал, что может быть способ отправить файл как ответ через DWR.

Ответы [ 4 ]

5 голосов
/ 14 сентября 2011
public ModelAndView writeFileContentInResponse(HttpServletRequest request, HttpServletResponse response) throws IOException {

        FileInputStream inputStream = new FileInputStream("FileInputStreamDemo.java");  //read the file

        response.setHeader("Content-Disposition","attachment; filename=test.txt");
        try {
            int c;
            while ((c = inputStream.read()) != -1) {
            response.getWriter().write(c);
            }
        } finally {
            if (inputStream != null) 
                inputStream.close();
                response.getWriter().close();
        }

        }
0 голосов
/ 21 марта 2014

Пример, который возвращает Excel для загрузки с клиента:

// Сторона Java:

public FileTransfer getExcel(Parametros param){
   byte[] result = <here get data>;
   InputStream myInputStream = new ByteArrayInputStream(result); 
   String excelFormat = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
   FileTransfer dwrExcelFile = new FileTransfer("excel.xlsx", excelFormat, myInputStream);
   return dwrExcelFile;
}

// Сторона Javascript:

function downloadExcelFile() {
  dwr.engine.setTimeout(59000);
  var params = <params_to_send>;
  <Java_class>.getExcel(params, {callback:function(dataFromServer) {
    downloadExcelCallback(dataFromServer);
  }});
}

function downloadExcelCallback(data) {
   dwr.engine.openInDownload(data);
}
0 голосов
/ 14 сентября 2011

вы вызываете метод из Java Script, верно? Я действительно не понимал, как Spring связан с этим потоком, но, насколько я знаю, DWR позволяет вам создавать заглушки сценариев Java и вызывать методы Java экспонированного компонента непосредственно на сервере прямо из вашего клиентского кода java-скрипта.

Вы можете читать файл побайтово и возвращать его из метода java, если он действительно возвращает байтовый массив. Однако что бы вы сделали с этим байтовым массивом на клиенте?

Я просто думаю, что в этом конкретном потоке вы не должны использовать DWR, а просто выполнить обычный AJAX-запрос (если DWR может как-то обернуть его для удобства - отлично). Этот запрос не должен поступать в DWRServlet, а должен обрабатываться обычным сервлетом / некоторой веб-средой, такой как Spring MVC :) Как только запрос поступит на сервлет, используйте

response.setHeader ("Content-Disposition", "attachment; filename = test.txt");

как уже было сказано.

Надеюсь, это поможет, Удачи! Mark

0 голосов
/ 14 сентября 2011

Прошло много лет с тех пор, как я использовал Spring, и я незнаком с DWR, но суть вашего вопроса является основной для Интернета.

Ответ - да, вы можете.По сути, вам нужно установить HTTP-заголовок Content-Disposition: attachment , а затем передать содержимое вниз.Все это будет в ответе на исходный запрос (в отличие от отправки обратной ссылки).

Фактический код для достижения этого будет зависеть от ваших обстоятельств, но это должно помочь вам начать.

...