2013-08-12 2 views
0

У меня странная ситуация с моим сервлетом изображения. Он хорошо работает с Eclipse, внутренним веб-браузером, но не будет работать с FireFox, InternetExplorer, Chrome, Opera ....Image Servlet не хочет показывать изображение в браузере (FireFox, IE ..), но в браузере Eclipse работает?

кода сервлета (ниже)

защищен недействительной doPost (HttpServletRequest запрос, HttpServletResponse ответ) бросает ServletException, IOException {

File fl=new File("C:\\Documents and Settings\\Administrator\\My Documents\\Eclipse\\zadatak\\WebContent\\WEB-INF\\upload\\"); 
    PrintWriter pw=response.getWriter(); 
    response.setContentType("text/html"); 

    pw.println("<html>"); 
    pw.println("<head>"); 
    pw.println("<style type=\"text/css\">"); 
    pw.println("img{display:block-inline;width:100px;height:100px;"); 
    pw.println("</style>"); 
    pw.println("</head>"); 
    pw.println("<body>"); 
    pw.println("<table border=\"1\">"); 
    pw.println("<tr>"); 

    for(File f:fl.listFiles()){ 
     pw.println("<td>"); 
     pw.println("<img src=\"" + f.getPath() + "\">"); 
     pw.println("</td>"); 
    } 

    pw.println("</tr>"); 
    pw.println("</table>"); 
    pw.println("</body>"); 
    pw.println("</html>"); 

}

В Eclipse, внутренний веб-браузер выглядит т его (ниже)

PrintScreen of Eclipse internal web browser

Наконец я нашел решение моей проблемы. Спасибо всем вам за помощь!

Теперь этот код работает!

ServletContext context=request.getServletContext(); 
    String path=context.getRealPath("upload"); 

    File fl=new File(path); 
    PrintWriter pw=response.getWriter(); 
    response.setContentType("text/html"); 

    pw.println("<html>"); 
    pw.println("<head>"); 
    pw.println("<style type=\"text/css\">"); 
    pw.println("img{display:block-inline;width:100px;height:100px;"); 
    pw.println("</style>"); 
    pw.println("</head>"); 
    pw.println("<body>"); 
    pw.println("<table border=\"1\">"); 
    pw.println("<tr>"); 

    LinkedHashMap<Integer, String> hm=new LinkedHashMap<Integer,String>(); 
    int imageIndex=-1; 
    for(File f:fl.listFiles()) {   
     if(f.getName()!=null){ 
      if(f.getName().endsWith(".bmp")) 
       hm.put(++imageIndex, f.getName()); 
     }    
    } 

    Iterator<String> pic=hm.values().iterator(); 

    while(pic.hasNext()){ 
     pw.println("<img src=\"upload/" + pic.next() + "\"/>"); 
    } 


    pw.println("</tr>"); 
    pw.println("</table>"); 
    pw.println("</body>"); 
    pw.println("</html>"); 

иерархия классов в моем проекте выглядит

MyWebProject 
|-- src 
| : 
| 
|-- web 
| |-- META-INF 
| | `-- MANIFEST.MF 
| |-- WEB-INF 
| | `-- web.xml 
|-- upload (the place where I keep pictures) 
:  

Firefox теперь может правильно показать фотографии

Firefox correctly shows page

+0

Вы, кажется, ожидаете, что изображения каким-то образом встроены в вывод HTML. Это неверно. Изображения запрашиваются и загружаются отдельно/индивидуально на основе URL-адреса в атрибуте 'src'. – BalusC

+1

Кстати, наличие папки с именем «upload» в пространстве развертывания также вызывает тревогу. Вы не должны хранить загруженные файлы в папке развертывания по той простой причине, что все они теряются после перераспределения WAR или даже при простое перезапуска сервера, что, в свою очередь, имеет очень простую причину, по которой новые добавленные файлы не содержатся в оригинальный файл WAR. Все со всеми, вы по-прежнему находитесь в совершенно неправильном направлении, несмотря на мой комментарий к предыдущему вопросу о связанном с этим вопросе. – BalusC

ответ

2

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

Ваш сервлет отправляет следующее в браузере:

<img src="C:\Documents and Settings\Administrator\My Documents\Eclipse\zadatak\WebContent\WEB-INF\upload\someIage.jpg"/> 

Это будет работать только если

  • браузер принимает для загрузки изображений из файловой системы, хотя страница HTML загружается с HTTP
  • Браузер принимает к загрузке файлы из файловой системы, хотя URL-адрес неверен (он должен быть file://...)
  • the clie нт работает на Windows,
  • пользователь случается, что папка с именем C:\Documents and Settings\Administrator\My Documents\Eclipse\zadatak\WebContent\WEB-INF\upload\ на своей машине
  • эта папка случается уже содержит все изображения, которые сервлет отправляет

Вы должны понимать, что это не может возможно Работа.

Что вам нужно, это сервлет, который загружает изображение из файла на сервере и отправляет содержимое этого файла в ответ HTTP-сервлета (и не забудьте установить правильный тип контента).

После того, как у вас есть такой сервлет (давайте предположим, что отображается в URL /image и принимает идентификатор изображения в качестве параметра), сервлет у вас уже есть, должен генерировать происходит некорректно код:

for (String id: idsOfTheImageToDisplay){ 
    pw.println("<td>"); 
    pw.println("<img src=\"/image?" + id + "\"/>"); 
    pw.println("</td>"); 

}

Кроме того, BMP не является хорошим форматом для Интернета, потому что он не соприкасается и, следовательно, потребляет много полосы пропускания. Например, вы должны преобразовать изображения в файлы JPEG.

+1

И используйте JSP для HTML. – BalusC

+0

Я согласен с вами в том, что формат * .bmp не подходит для Интернета. Я использую * .bmp только для тестового проекта (реальные фотографии находятся в формате * .jpg). Я начал изучать Java до трех месяцев, и у меня нет слишком много опыта программирования java-ee. Большое спасибо за ваш ответ! – anna

+1

Проблема, которую вы создали/сталкиваетесь, не совсем специфична для Java/Java EE. Просто базовая веб-разработка (HTTP, HTML и друзья). Помимо базовой Java, настоятельно рекомендуется иметь хорошие знания HTTP/HTML перед погружением в сервлеты, поскольку они в контексте этого вопроса в основном просто прослушиватели HTTP-запросов и генераторы HTML-кода. – BalusC