Возникла проблема при использовании OutputStream & (DataOutPutStream или PrintWriter) - PullRequest
0 голосов
/ 03 мая 2011

Я написал простой сервер, использующий программирование сокетов Java, и намеревался сделать так, чтобы он предлагал 2 файла для загрузки и отображал некоторые html-ответы после завершения загрузки. Я использовал PrintWriter.print или DataOutPutStream.writeBytes, чтобы отправить строку, включающую теги html и строку ответа, в браузер, а затем использовать OutputStream.write для отправки запрошенного файла. URL, который я набрал в браузере, был похож на 127.0.0.1/test1.zip, соответствующие фрагменты кода следующие:

pout.print("<html>");
pout.print("<head>");
pout.print("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1/\">");
pout.print("<title>Response</title>");
pout.print("</head>");
pout.print("<body>");
pout.print(createResponseHeader(200, fileTypeCode));
pout.print("</body>");
pout.print("</html>");
pout.print(createResponseHeader(200, fileTypeCode));
pout.flush();

byte[] buffer = new byte[client.getSendBufferSize()];
int bytesRead = 0;
System.out.println("Sending...");
while((bytesRead = requestedFile.read(buffer))>-1)
{
    out.write(buffer,0,bytesRead);
}

pout - это PrintWriter, а out - это OutputStream. Проблема в том, что когда я пытаюсь использовать 127.0.0.1/test2.zip для загрузки файла, он не позволяет мне загружать, вместо этого распечатывает строку ответа и много бессмысленных символов в браузере, например,

HTTP / 1.0 200 OK

Соединение: закрыть

Сервер: сервер назначений COMP5116 v0

Тип содержимого: приложение / сжатый x-zip

PK ‹â: Lmá ^ Л Í test2.wmvì [y <”Ûÿ? 3ÃØ — Ab¸eeË'5K" »± f_B * Å * YÛ • ¥ M5h ± ¯u [(\ · (- ÷ F) ß3ÏÉ½ÝºÝ × ýýñ {Íg ^ ÏûyžóYÏçœçyÎç¼P '> ™ îÝ + ½Žö6A € ;; ýmüH » ãDŸã © ïÍš] Ð4iIJ0Àª3] B € ðÀ¸CôÁ`ä è1ü½¤Ã¬ $ pBi

Полагаю, это просто отображает zip-файл в виде строки с заголовком ответа. Кажется, когда PrintWriter используется перед кодом отправки файла, весь поток вывода используется для отправки строки вместо байтов. Однако, если я добавлю часть кода отправки ответа ПОСЛЕ кода отправки файла, загрузка будет работать правильно, но в браузере не будет распечатано никакого сообщения с ответом, просто пустая страница.

1 Ответ

0 голосов
/ 03 мая 2011

Вы должны удалить здесь свой HTML-код и отправить только двоичные данные. Вы не можете смешивать их в одном сервлете.

Добиться того, что вы хотите сделать, нелегко.

Я бы начал загрузку с некоторого кода JavaScript на странице, а затем страница запросит с помощью Ajax сервлет на стороне сервера, который будет знать, завершена ли загрузка для этого конкретного сеанса. На самом деле нет события завершения загрузки в JavaScript.

Для получения этой информации сервлет загрузки обновит сеанс с флагом, когда загрузка будет завершена.

Когда ваш вызов Ajax вернется после завершения загрузки, вы можете изменить текст на странице или перенаправить на новую страницу.

Редактировать : В качестве альтернативы, если вы сможете изменить свои требования, будет намного проще показать все сообщения, которые вы должны показать непосредственно перед загрузкой, и поставить target = "_ blank" в ссылке для скачивания. чтобы ваша страница не терялась при нажатии на ссылку.

...