Java Servlet Mysql Blob-образ

#java #mysql #servlets

#java #mysql #сервлеты

Вопрос:

Привет, ребята, я пытаюсь создать веб-приложение, в котором пользователи смогут загружать изображение в свой профиль. Итак, у меня есть таблица users и изображение в виде большого двоичного объекта в строке в этой таблице, и теперь я пытаюсь извлечь его, используя java servlet, но я получаю только небольшой пробел square.my код:

 import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;

public class Profile extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    ServletOutputStream out = response.getOutputStream();
    try{

    Class.forName("com.mysql.jdbc.Driver");

      Connection  con=DriverManager.getConnection
                 ("jdbc:mysql://195.251.267.131:3306/****","****","****");

    PreparedStatement ps=con.prepareStatement
              ("select * from users where email=?");
HttpSession session=request.getSession(false);
if(session!=null){
String email=(String)session.getAttribute("email");
Blob photo = null;                    
    ps.setString(1, email);

    ResultSet rs =ps.executeQuery();
        while(rs.next()) {
  photo = rs.getBlob(1);
  }
  response.setContentType("image/jpg");
  InputStream in = photo.getBinaryStream();
  int length = (int) photo.length();

  int bufferSize = 1024;
  byte[] buffer = new byte[bufferSize];

  while ((length = in.read(buffer)) != -1) {
    System.out.println("writing "   length   " bytes");
    out.write(buffer, 0, length);
  }

      in.close();
  out.flush(); 
      }
   }
}
  

Комментарии:

1. Может быть, выполнить отладчик и проверить, что получено, а затем записать это здесь? Вы также должны проверить свою клиентскую часть, чтобы убедиться, что она что-то отправляет.

Ответ №1:

Я вижу некоторые возможные причины в вашем коде:

Кроме того, я также предлагаю эти незначительные исправления:

  • Не инициализировать length=photo.length . Это бесполезно.
  • Используйте размеры буфера, кратные 4096. Это более эффективно.
  • Приступая к выполнению out.flush() , вы также должны закрыть открытые потоки ( out и in ), предпочтительно в инструкции try-with-resources:

try(OutputStream out=response.getOutputStream())
{
...
}

То же самое для ресурсов JDBC: соединений, инструкций и наборов результатов.

  • Вам следует подумать об альтернативном поведении, когда session ==null. Например, выбрасывание ServletException с описывающим сообщением.

Комментарии:

1. я попробовал предложенные вами исправления и временно удалил if (session! = null), результат, который я получаю, все тот же маленький пустой квадрат с границами в правом верхнем углу моей страницы

2. Пожалуйста, протестируйте свой сервлет, вызвав его непосредственно из адресной строки браузера: http://server:port/context/servlet , и посмотрите, какой ответ возвращает сервер.