Изображения не отображаются при вызове веб-сайта с веб-сервера - PullRequest
0 голосов
/ 14 июля 2009

У меня веб-сервер Java (без стандартного программного обеспечения ... самостоятельно написано) . Кажется, все работает нормально, но когда я пытаюсь вызвать страницу, содержащую картинки, эти картинки не отображаются. Нужно ли отправлять изображения с выходным потоком клиенту? Я пропустил дополнительный шаг?

Поскольку здесь слишком много кода, чтобы разместить его здесь, вот небольшая схема того, что происходит или должно происходить:

1. client logs in
2. client gets a session id and so on
3. the client is connected with an output stream
4. we built the response with the HTML-Code for a certain 'GET'-request 
5. look what the GET-request is all about
6. send html response || file || image (not working yet)

Так много для основного плана ...

Он отправляет css-файлы и прочее, но у меня все еще есть проблема с изображениями! У кого-нибудь есть идея? Как я могу отправлять изображения с сервера в браузер? Спасибо.

Я проверяю запросы от клиента и ответы с сервера с помощью charles. Он отправляет файлы (например, css или js) нормально, но не с изображениями: хотя статус «200 OK», кодировка передачи - chunked ... Я понятия не имею, что это значит! ? Кто-нибудь знает?

EDIT: Вот код чтения файла:

 try{
      File requestedFile = new File( file );
      PrintStream out = new PrintStream( this.getHttpExchange().getResponseBody() );
      // File wird geschickt:
      InputStream in = new FileInputStream( requestedFile );
      byte content[] = new byte[(int)requestedFile.length()];
      in.read( content );

      try{
           // some header stuff
           out.write( content );
      }
      catch( Exception e ){
           e.printStackTrace();
      }

      in.close();

      if(out!=null){
           out.close();
           System.out.println( "FILE " + uri + " SEND!" );
      }
 }
 catch ( /*all exceptions*/ ) {  
      // catch it ...
 }

Ответы [ 5 ]

3 голосов
/ 14 июля 2009

Ваш браузер будет отправлять отдельные GET image.png HTTP 1.1 запросы на ваш сервер, вы также должны обрабатывать эти файлы. Нет хорошего способа встраивания и отображения изображений, не зависящих от браузера, в HTML, в некоторых браузерах доступен только обработчик протокола <img src="data:base64codedimage">.

Создавая HTML-ответ, вы можете включать содержимое внешних файлов js / css непосредственно между тегами <script></script> и <style></style>.

Редактировать: Советую использовать Firebug для дальнейшей диагностики.

2 голосов
/ 14 июля 2009

Вы уверены, что отправили правильный тип MIME для файлов?

Если вам нужен крошечный веб-сервер OpenSource, вдохновленный, то взгляните на http://www.acme.com/java/software/Acme.Serve.Serve.html, который хорошо нам подходит для специальных серверных нужд.

1 голос
/ 14 июля 2009

Должен ли я отправлять эти внешние файлы? или изображения с выходным потоком в клиент?

Клиент будет делать отдельные запросы для тех файлов, которые должен обслуживать ваш сервер. Однако эти запросы могут поступать через одно и то же постоянное соединение (например, keepalive). Две наиболее вероятные причины вашей проблемы:

  1. Клиент пытается отправить несколько запросов через постоянное соединение (по умолчанию это HTTP 1.1), и ваш сервер не обрабатывает это правильно. Самый простой способ избежать этого - отправить заголовок Connection: close с ответом.
  2. Клиент пытается открыть отдельное соединение, а ваш сервер обрабатывает его неправильно.

Edit:

Есть проблема с этой строкой:

in.read( content );

Этот метод не гарантирует заполнение массива; он прочитает произвольное количество байтов и вернет это число. Вы должны использовать его в цикле, чтобы убедиться, что все прочитано. Так как в любом случае вам нужно сделать цикл, рекомендуется использовать меньший массив в качестве буфера, чтобы избежать сохранения всего файла в памяти и запуска в OutOfMemoryError с большими файлами.

1 голос
/ 14 июля 2009

Изображения (и файлы css / js) запрашиваются браузером как полностью отдельные запросы GET к странице, поэтому определенно нет необходимости «отправлять их ... с потоком вывода». Поэтому, если вы получаете хорошо обслуживаемые страницы, но изображения не загружаются, мое первое предположение состоит в том, что вы не устанавливаете заголовки ответа должным образом (например, устанавливая Content-Type ответа на text/html ), поэтому браузер не интерпретирует ее как правильную страницу и, следовательно, не загружает изображения.

Некоторые другие вещи, которые можно попробовать, если это не сработает:

  • Проверьте, можете ли вы получить доступ к изображению напрямую
  • Используйте что-то вроде firebug или fiddler, чтобы проверить, действительно ли браузер запрашивает файлы image / css / js и что все ваши заголовки запросов / ответов выглядят нормально
  • Использовать существующий веб-сервер !
1 голос
/ 14 июля 2009

Вероятно, на шаге 4 вы ошибаетесь:

// 4. we built the response with the HTML-Code for a certain 'GET'-request 

Некоторые из запросов будут «GET /css/styles.css» или «GET /js/main.js» или «GET /images/header.jpg». Убедитесь в том, что эти файлы передаются в потоковом режиме, попробуйте загрузить эти URL-адреса напрямую.

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