Servlet отправка файла клиенту

210
16 июля 2018, 02:20

Мне нужно реализовать передачу файла с сервера на клиент. Файл выбирается сервером и отправляется клиенту. Использую jsp/servlet. Сколько не искал везде есть информация о том как загрузить на сервер а вот как получить толком нет. Подскажите пожалуйста!) Может у кого есть готовая реализация или направьте на путь истины и просветления где искать.

Answer 1
  1. Создаём сервлет и переопределяем метод get
  2. Получаем наш необходимый файл как массив байт
  3. Выставляем в response необходимые атрибуты.
  4. Пишем байты в OutputStream response

    public class GetReportServlet extends HttpServlet {
        public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            ServletContext context = getServletContext();
            ServletOutputStream out = resp.getOutputStream();
            byte[] byteArray = Files.readAllBytes(path);
            //данный контент type говорит что будет файл в формате excel
            resp.setContentType("application/vnd.ms-excel");
            resp.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
            out.write(byteArray);
            out.flush();
            out.close();
        }
    }
    
Answer 2

Можно восопльзоваться библиотекой commons-fileupload. Можно загружать не только файлы но и передавать какие либо данные.

Пример:

// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();
// Configure a repository (to ensure a secure temp location is used)
ServletContext servletContext = this.getServletConfig().getServletContext();
File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
factory.setRepository(repository);
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// Parse the request
List<FileItem> items = upload.parseRequest(request);
// Process the uploaded items
Iterator<FileItem> iter = items.iterator();
while (iter.hasNext()) {
    FileItem item = iter.next();
    if (item.isFormField()) {
        processFormField(item);
    } else {
        processUploadedFile(item);
    }
}
Answer 3

Благодарю всех. Я сделал следующую реализацию.

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    File file = new File(fileName);
    ServletOutputStream outputStream = null;
    BufferedInputStream inputStream = null;
    try {
        outputStream = response.getOutputStream();
        response.setContentType("application/vnd.ms-excel");
        response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
        response.setContentLength((int) file.length());
        FileInputStream fileInputStream = new FileInputStream(file);
        inputStream = new BufferedInputStream(fileInputStream);
        int readBytes = 0;
        while ((readBytes = inputStream.read()) != -1)
            outputStream.write(readBytes);
    }catch (ExportException e){
        e.printStackTrace();
    }finally {
        outputStream.flush();
        outputStream.close();
        inputStream.close();
    }
}
READ ALSO
Ошибка в java коде. (андроид приложение)

Ошибка в java коде. (андроид приложение)

В одной из папок приложения под андроид есть файл (а точнее несколько файлов) в одной и той-же ошибкой- "Unknown entity 'R'"

163
Как получить результат, при выполнении JUnit?

Как получить результат, при выполнении JUnit?

Код который нужнно протестировать

201
Средняя скорость ответа юзера

Средняя скорость ответа юзера

Есть чат между оператором и клиентом

198