#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:
Я вижу некоторые возможные причины в вашем коде:
- Не устанавливайте ContentType=text / html в начале. Это бесполезно.
- Правильный mimetype для изображений jpg является
image/jpeg
.
Кроме того, я также предлагаю эти незначительные исправления:
- Не инициализировать
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
, и посмотрите, какой ответ возвращает сервер.