Почему сервлет Java выдает ClientAbortException, если размер файла превышает 2 МБ?

Я пытаюсь написать Java-сервлет, расположенный на сервере Linux, который может использоваться клиентом для загрузки видеофайла. Он работает, когда размер файла небольшой (возможно, менее 2 МБ), но больший размер файла возвращает ошибку: org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe,

После поиска в Google появляется эта ошибка, когда клиент разрывает соединение. В моем случае я использую клиент и могу подтвердить, что я не делаю ничего, что могло бы разорвать соединение (по крайней мере, не нарочно) - браузер остается открытым и т. Д., Когда возникает эта ошибка.

Есть идеи, что может быть причиной (и как это исправить)?

public class GetFile extends HttpServlet {

@Override
public void init(ServletConfig config) throws ServletException {
  super.init(config);
}

protected void doPost(HttpServletRequest req, HttpServletResponse res)
  throws ServletException, IOException {

String filename ="init_java";

try {

    // get user parameters
    filename = req.getParameter("fileId");  // complete path to video file
    //res.setContentType("video/mp4");  //not working
    res.setContentType("application/x-download");  

    File file=new File(filename);

    if (file.exists()) {

        res.setHeader("Content-Disposition", "inline; filename=\""+filename+"\"");
        res.setHeader("Cache-Control", "cache, must-revalidate");
        //res.setHeader("Pragma", "public"); // not sure when to use
        returnFile(filename, res.getOutputStream());

    } else {
        //error handling goes here
    }     

} catch (Exception e) {
    ...
} finally {
    ... 
}
}


private static void returnFile(String filename, OutputStream out) throws FileNotFoundException, IOException {
  InputStream in = null;
  try {
      in = new BufferedInputStream(new FileInputStream(filename));
      byte[] buf = new byte[4 * 1024]; // 4K buffer
      int bytesRead;
      while ((bytesRead = in.read(buf)) != -1) {
          out.write(buf, 0, bytesRead);
      }

  } finally {
      if (in != null) in.close();
  }
}

}

ОБНОВЛЕНИЕ 1

Я вижу следующую ошибку в mod_jk.log файл (который передает запрос с веб-сервера Apache на сервер приложений GlassFish):

[info] init_jk::mod_jk.c (3383): mod_jk/1.2.40 initialized
[error] ajp_connection_tcp_get_message::jk_ajp_common.c (1313): wrong message format 0xcad5 from ::1:8009
[error] ajp_get_reply::jk_ajp_common.c (2204): (worker1) Tomcat is down or network problems. Part of the response has already been sent to the client
[info] ajp_service::jk_ajp_common.c (2673): (worker1) sending request to tomcat failed (recoverable), because of protocol error (attempt=1)
[info] ajp_process_callback::jk_ajp_common.c (2000): Writing to client aborted or client network problems
[info] ajp_service::jk_ajp_common.c (2673): (worker1) sending request to tomcat failed (unrecoverable), because of client write error (attempt=2)
[info] jk_handler::mod_jk.c (2799): Aborting connection for worker=worker1

Похоже, что он отслеживает то, что я наблюдаю, но я здесь не эксперт - дает ли это какое-либо представление о том, что может быть основной причиной?

2 ответа

Решение

Оказывается, это ошибка GlassFish. Исправление заключается в установке 2 файлов, найденных здесь:

https://java.net/jira/browse/GLASSFISH-18446

Вероятно, это связано с ограничением, установленным на вашем сервере. Проверьте файл свойств. Я уверен, что есть тот, который говорит, что нет файлов размером более 2 МБ.

Другие вопросы по тегам