@Wan-Derer
Зобанели на Хабре, волки́ ;((

Как в Reactor Netty отправить файл?

Пытаюсь отправлять файл:

public Publisher<Void> download(HttpServerRequest req, HttpServerResponse resp) {

  try {
    String filePath = reportService.getFilePath(Integer.parseInt(req.param("id")));

    if (filePath == null) {
      return resp
        .status(HttpResponseStatus.NOT_FOUND)
        ;
    }

    Path file = Path.of(filePath);
    String filename = URLEncoder.encode(
      file.getFileName().toString(), StandardCharsets.UTF_8).replace("+", "%20");

    return resp
      .status(HttpResponseStatus.OK)
      .addHeader(ACCESS_CONTROL_ALLOW_ORIGIN, "*")     // CORS
      .addHeader(ACCESS_CONTROL_EXPOSE_HEADERS, "filename")
      .addHeader("filename", filename)
      .addHeader(CONTENT_TYPE, "application/octet-stream")
//        .sendFile(file)
//        .sendString(Mono.just("OLOLO"))
      ;

  } catch (Exception e) {
    return getErrorResponse(resp, e);
  }
}


Если делаю .sendFile(file) то получаю ошибку
ERROR r.n.http.server.HttpServerOperations - [cc0803bd-1, L:/127.0.0.1:8081 - R:/127.0.0.1:52065] Error finishing response. Closing connection


Если делаю .sendString(Mono.just("OLOLO")) то скачивается файл с содержимым OLOLO, т.е. всё остальное (заголовки и пр.) нормальное. А как собственно файл отправить?
  • Вопрос задан
  • 44 просмотра
Решения вопроса 1
@Wan-Derer Автор вопроса
Зобанели на Хабре, волки́ ;((
Оставлю таблетку для памяти :) Так работает:

// GET /api/reports/download/{id}
public Publisher<Void> download(HttpServerRequest req, HttpServerResponse resp) {

  try {
    String filePath = reportService.getFilePath(Integer.parseInt(req.param("id")));

    if (filePath == null) return resp.status(HttpResponseStatus.NOT_FOUND);

    Path file = Path.of(filePath);
    String filename =
      URLEncoder.encode(file.getFileName().toString(), StandardCharsets.UTF_8).replace("+", "%20");

    return resp
      .status(HttpResponseStatus.OK)
      .addHeader(ACCESS_CONTROL_ALLOW_ORIGIN, "*")     // CORS
      .addHeader(ACCESS_CONTROL_EXPOSE_HEADERS, "filename")
      .addHeader("filename", filename)
      .addHeader(CONTENT_TYPE, "application/octet-stream")
      .sendFileChunked(file, 0, file.toFile().length())     // or Files.size(file) ??
      ;

  } catch (Exception e) {
    return getErrorResponse(resp, e);
  }
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы