как записать файловый объект в ответ сервера и без сохранения файла на сервере?


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

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

4 2

4 ответа:

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();
        }

        }

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

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

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

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

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

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

Ответ.setHeader ("Content-Disposition", " attachment; filename=test.txt");

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

Надеюсь, это поможет, Удачи вам! Марк

Пример, который возвращает 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);
}