Получение изображения из сервлета

Модератор: Absurd

Ответить
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

Есть такое мнение, что нужно указывать content-length.
Даже самый дурацкий замысел можно воплотить мастерски
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

А сохранить для начала в файл, и файл открыть в браузере пробовал?
Даже самый дурацкий замысел можно воплотить мастерски
EcoloRa
Сообщения: 7
Зарегистрирован: 10 мар 2004, 04:08
Откуда: Красноярск

Внимание! Привожу последний вариант метода doPost:
Появились setContentLength() и close(), но получение рисунка все-равно не работает. А вот запись байтов в файл (выделено жирным) работает!!! Получается нормальный jpg рисунок.

Код: Выделить всё

public void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {

	performTask(request, response);
	//response.setContentType("text/html;charset=Windows-1251");
	response.setContentType("image/jpeg");
	//response.setContentType("application/download");
	//прослеживанию сеанс
	HttpSession hs = request.getSession(true);
	String s =	(String) hs.getValue("correct");
	if ((s != null) && (s.equals(ValueCorrectSeanse))) {
	try 
		{
	    Class.forName(MySQLDriver).newInstance();
	    
		Properties connInfo = new Properties();
		connInfo.put("user",MySQLUser);
		connInfo.put("password",MySQLPassword);
		connInfo.put("useUnicode","true");
		connInfo.put("characterEncoding",MySQLcharacterEncoding);

	    //Conn = DriverManager.getConnection(MySQLUrl,MySQLUser,MySQLPassword);
		Conn = DriverManager.getConnection(MySQLUrl,connInfo);
		
	    Stmt = Conn.createStatement();
	    //Пытаюсь заюзать базу
		Stmt.executeUpdate("USE news");
		RS = Stmt.executeQuery("SELECT image FROM News_images where rowid=1");
		while (RS.next()) {
			com.mysql.jdbc.Blob bl = null;
			bl = (com.mysql.jdbc.Blob) RS.getBlob("image");
			
			[b]OutputStream f1 = new FileOutputStream("c:/temp/file111.jpg");
			f1.write(bl.getBytes(1,(int) bl.length()));
			f1.close();[/b]
			
			response.setContentLength((int) bl.length());
			//Создать объект класса ObjectOutputStream.
			ObjectOutputStream out = new ObjectOutputStream(response.getOutputStream());
			//запись в поток
			out.write(bl.getBytes(1,(int) bl.length()));
			//Очистить поток, чтобы быть уверенным в том, что всё содержимое послано клиенту.
			out.flush();
			out.close();
		}
	}
	catch (Exception E) 
	{
	    //pw.println(MesageError);
	    //pw.println(E);
	}
	
	//конец ифа ниже
	}
	else {
		//pw.println("<H2>"+AcessDenied+"<H2>");
		}
}
В чем же проблема???
EcoloRa
Сообщения: 7
Зарегистрирован: 10 мар 2004, 04:08
Откуда: Красноярск

попробуй воспользоваться Код:
Blob.getBinaryStream()
Я плохо разбираюсь в Java. Ты не мог бы привести пример?
Bas
Сообщения: 21
Зарегистрирован: 10 мар 2004, 21:46

Раз в файл правильно пишется, то попробуй так:

Код: Выделить всё

public void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException { 

   // !!! BAS !!!  performTask(request, response); 
   response.setContentType("image/jpeg"); 
   //прослеживанию сеанс 
   HttpSession hs = request.getSession(true); 
   String s =   (String) hs.getValue("correct"); 
   if ((s != null) && (s.equals(ValueCorrectSeanse))) { 
   try 
      { 
       Class.forName(MySQLDriver).newInstance(); 
       
      Properties connInfo = new Properties(); 
      connInfo.put("user",MySQLUser); 
      connInfo.put("password",MySQLPassword); 
      connInfo.put("useUnicode","true"); 
      connInfo.put("characterEncoding",MySQLcharacterEncoding); 

       //Conn = DriverManager.getConnection(MySQLUrl,MySQLUser,MySQLPassword); 
      Conn = DriverManager.getConnection(MySQLUrl,connInfo); 
       
       Stmt = Conn.createStatement(); 
       //Пытаюсь заюзать базу 
      Stmt.executeUpdate("USE news"); 
      RS = Stmt.executeQuery("SELECT image FROM News_images where rowid=1"); 
      while (RS.next()) { 
         com.mysql.jdbc.Blob bl = null; 
         bl = (com.mysql.jdbc.Blob) RS.getBlob("image"); 
          
         //Создать объект класса ObjectOutputStream. 
         OutputStream out = response.getOutputStream(); 
         //запись в поток 
         out.write(bl.getBytes(1,(int) bl.length())); 
         //Очистить поток, чтобы быть уверенным в том, что всё содержимое послано клиенту. 
         out.flush(); 
         out.close(); 
         // !!! BAS !!! to make sure that there are no more images to write
         break;
      } 
   } 
   catch (Exception E) 
   { 
       //pw.println(MesageError); 
       //pw.println(E); 
   } 
    
   //конец ифа ниже 
   } 
   else { 
      //pw.println("<H2>"+AcessDenied+"<H2>"); 
      } 
}
Заметь, что я закомментировал performTask - у меня такое чувство, что там что-то пишется в выход response'а - это недопустимо, когда выводишь image - stream должен содержать только сам image. Если твой performTask как-то красиво оформляет страничку (заголовок там, или еще какой логотип), то тебе надо сделать примерно так:

Код: Выделить всё

public void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException { 
   performTask(request, response); 
   //прослеживанию сеанс 
   HttpSession hs = request.getSession(true); 
   String s =   (String) hs.getValue("correct"); 
   if ((s != null) && (s.equals(ValueCorrectSeanse))) { 
   try 
      { 
       Class.forName(MySQLDriver).newInstance(); 
       
      Properties connInfo = new Properties(); 
      connInfo.put("user",MySQLUser); 
      connInfo.put("password",MySQLPassword); 
      connInfo.put("useUnicode","true"); 
      connInfo.put("characterEncoding",MySQLcharacterEncoding); 

       //Conn = DriverManager.getConnection(MySQLUrl,MySQLUser,MySQLPassword); 
      Conn = DriverManager.getConnection(MySQLUrl,connInfo); 
       
       Stmt = Conn.createStatement(); 
       //Пытаюсь заюзать базу 
      Stmt.executeUpdate("USE news"); 
      RS = Stmt.executeQuery("SELECT image FROM News_images where rowid=1"); 
      while (RS.next()) { 
         com.mysql.jdbc.Blob bl = null; 
         bl = (com.mysql.jdbc.Blob) RS.getBlob("image"); 
         String  someFileNameOnServer = "/images/imageFromDB.jpg";
         OutputStream f1 = new FileOutputStream(someFileNameOnServer); 
         f1.write(bl.getBytes(1,(int) bl.length())); 
         f1.close();
         //запись в поток 
          PrintWriter writer = new PrintWriter(response.getWriter());
         writer.println("<IMG src=\""+someFileNameOnServer+"\" />"); 
         writer.flush(); 
         // !!! BAS !!! to make sure that there are no more images to write
         break;
      } 
   } 
   catch (Exception E) 
   { 
       //pw.println(MesageError); 
       //pw.println(E); 
   } 
    
   //конец ифа ниже 
   } 
   else { 
      //pw.println("<H2>"+AcessDenied+"<H2>"); 
      } 
}
Записываем image в файл на сервере, и в страничку вставляем <IMG> таг со ссылкой на этот самый файл... Надо разобраться с путями на сервере, и с различными images в базе (не пиши их в один и тот же файл ;) ), а еще эти файлы было бы неплохо удалять время от времени, синхронизировать... - нет, это плохой способ!!! :lol:
EcoloRa
Сообщения: 7
Зарегистрирован: 10 мар 2004, 04:08
Откуда: Красноярск

Оказывается мой код рабочий (за одним исключением), моя ошибка в том, что я вместо OutputStream out = response.getOutputStream()
использую ObjectOutputStream.
Вопрос снят. :0)
Ответить