Получение изображения из сервлета
Модератор: Absurd
Есть такое мнение, что нужно указывать content-length.
Даже самый дурацкий замысел можно воплотить мастерски
А сохранить для начала в файл, и файл открыть в браузере пробовал?
Даже самый дурацкий замысел можно воплотить мастерски
Внимание! Привожу последний вариант метода doPost:
Появились setContentLength() и close(), но получение рисунка все-равно не работает. А вот запись байтов в файл (выделено жирным) работает!!! Получается нормальный jpg рисунок.
В чем же проблема???
Появились 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>");
}
}
Я плохо разбираюсь в Java. Ты не мог бы привести пример?попробуй воспользоваться Код:
Blob.getBinaryStream()
Раз в файл правильно пишется, то попробуй так:
Заметь, что я закомментировал performTask - у меня такое чувство, что там что-то пишется в выход response'а - это недопустимо, когда выводишь image - stream должен содержать только сам image. Если твой performTask как-то красиво оформляет страничку (заголовок там, или еще какой логотип), то тебе надо сделать примерно так:
Записываем image в файл на сервере, и в страничку вставляем <IMG> таг со ссылкой на этот самый файл... Надо разобраться с путями на сервере, и с различными images в базе (не пиши их в один и тот же файл
), а еще эти файлы было бы неплохо удалять время от времени, синхронизировать... - нет, это плохой способ!!! :lol:
Код: Выделить всё
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>");
}
}
Код: Выделить всё
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>");
}
}

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