Браузер скачать завершить мероприятие - PullRequest
11 голосов
/ 06 октября 2009

Мы некоторое время искали ответ на этот вопрос, но не нашли решения.

У нас есть веб-сервер, который позволяет пользователю загружать файлы (pdf), которые генерируются динамически и обслуживаются из сервлетов. Мы хотели бы знать, когда загрузка была завершена (и как: она прошла успешно, не удалось ли, пользователь отменил?).

Есть ли способ узнать это без ввода пользователя? Эти файлы относительно малы, поэтому не нужны никакие индикаторы выполнения, но нам нужна какая-то «конечная ловушка», которая сообщает о завершении загрузки. Это возможно?

[править] Какие возможности будут на стороне браузера, которые могут определять окончание загрузки и отправлять отчеты на сервер через ajax?

Ответы [ 6 ]

8 голосов
/ 12 октября 2009

Вы можете получить довольно хорошую идею от сервера, который подключен к браузеру напрямую (конечная точка TCP-соединения). Сервер получит ошибку ввода-вывода, когда пользователь отменяет загрузку или сталкивается с любой проблемой сети. Так что, если вы можете запустить сервер напрямую (без прокси). Вы можете сделать что-то вроде этого,

  try {
      response.setContentType("application/pdf");
      response.setContentLength(bytes.length);
      ServletOutputStream ouputStream = response.getOutputStream();
      ouputStream.write(bytes, 0, bytes.length);
      ouputStream.flush();
      ouputStream.close();
      logger.info("PDF " + fileName + " sent successfully");
  } catch (Exception e) {
      logger.error("PDF " + fileName + " error: " + e.getMessage());
      throw e;
  }

Однако существует небольшая вероятность того, что пользователь может не увидеть PDF в браузере после успешной загрузки. ACK от браузера будет лучшим подходом. Вы не можете сделать это, если PDF отображается браузером напрямую. Вам нужно использовать какой-нибудь Javascript PDF Viewer и добавить обратный вызов на сервер, когда он отображается.

2 голосов
/ 10 октября 2009

Отмена пользователя может иногда быть обнаружена в сервлете. Используя Tomcat, например, попробуйте передать большой файл клиенту, а затем отмените загрузку. Вы можете увидеть трассировку стека исключения в logs / catalona.out. Однако я не уверен, что это можно сделать в самом сервлете или на более низком уровне (внутри каталины).

Для загрузки изображений обычно используется метод предварительной загрузки (обязательно с прослушивателем событий средство ). Браузер может загрузить весь PDF или нет, если он обнаружит его как неподдерживаемое изображение, но стоит попробовать. Здесь является примером.

Другим решением может быть неявная загрузка PDF с использованием тегов <object> или <embed> и использование прослушивателя событий onload. Не то чтобы это работало только в том случае, если в браузере выполняется ActiveX или какая-либо ассоциация PDF-файлов, и, вероятно, не будет работать, если у пользователя нет программы просмотра PDF. Здесь - пример, демонстрирующий это (см. Вспомогательное решение: 21.11.04, 08:22, ID: 12638846).

Мохсен

1 голос
/ 12 октября 2009

Браузер изначально не справляется с этим, но вы можете использовать google gears для обработки запроса на загрузку (он вызовет событие успеха, когда загрузка будет завершена).

http://code.google.com/apis/gears/api_httprequest.html

1 голос
/ 06 октября 2009

Даже при небольшом размере файла, если вы используете метод setContentLength, равный ServletResponse, пользователь сможет различить ошибку и удачную загрузку, а менеджер загрузок своего браузера сообщит им, когда она будет завершена.

1 голос
/ 06 октября 2009

Если вы не получили ошибку сети, вы не можете знать. Единственный способ - заставить браузер отправить второе событие на сервер (используя AJAX), чтобы подтвердить, что загрузка была успешно завершена.

0 голосов
/ 14 октября 2009

Если вы можете вставить поле изображения в ваши документы, изображение может указать на ваш сервер, чтобы подтвердить, что пользователь открыл документ в формате PDF.

Я сам не пробовал, но посмотреть на последнюю страницу этого Adobe Doc представляется возможным.

Если вы используете Itext, он не поддерживает поля изображения, но вы можете использовать шаблон PDF с полем изображения для создания ваших документов и добавить JavaScript, чтобы назначить URL-адрес для поля изображения.

...