Как прочитать большой двоичный объект, отправляемый через ajax на Java-сервер - PullRequest
1 голос
/ 29 июня 2019

Итак, я пытаюсь отправить изображение BLOB на сервер Java через AJAX, а затем преобразовать его в массив btye.Я могу получить BufferedInputStream;однако, когда я пытаюсь преобразовать это в байтовый массив, программа зависает и не будет продолжать.Кто-нибудь знает, почему это может быть?

Клиентская сторона выглядит так:

 $.ajax({
        type: "POST",
        url: "/com/uploadImage/",

        data: blobImage,
        cache: false,
        contentType: false,
        processData: false,
        success: function (data) {
            console.log(data);
        }

Вот мой код Java:

  public void handleRequest() {
    try {
       BufferedInputStream bis = new BufferedInputStream(this.getSocket().getInputStream());

       //this is the line that causes the program to hang
       byte[] bytes = IOUtils.toByteArray(bis);
       FileUtils.writeByteArrayToFile(new File("image.png"), bytes);

    } catch (Exception e) {
        e.printStackTrace();
    }
}

1 Ответ

0 голосов
/ 29 июня 2019

Мне кажется, я знаю, что здесь происходит, но могу ошибаться.Линия IOUtils.toByteArray, скорее всего, не остановится, пока не достигнет конца потока.Поскольку в любое время по сети может поступать больше данных, вызов будет застревать в ожидании, пока не узнает, что больше ничего не поступит.Это будет известно только после завершения вызова AJAX на клиенте.Это говорит о том, что проблема в том, что клиент застрял и поэтому держит сервер.

Но почему клиент застрял?Потому что это ждет ответа.HTTP - это улица с двусторонним движением, и сервер должен подтверждать запрос по мере его поступления через сокет, не дожидаясь завершения соединения.

По сути, то, что вы должны делать, вместо того, чтобы читать всю информацию вbyte[] заключается в том, что вы должны читать его постепенно в цикле.Затем вы должны ответить, как только клиент отправит все данные, которые составляют запрос.В HTTP клиент выполняет запрос, когда отправляет пустую строку на сервер.

Хотя это чисто предположение и должно рассматриваться как таковое.Я мог бы что-то здесь упустить.

Кроме того, примечание - IOUtils.toByteArray не требует, чтобы вы входили в поток ввода в BufferedInputStream.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...