Как загрузить изображение и сохранить его в базе данных?
Мне нужно создать форму с помощью JavaScript, и пользователь загрузит файл JPG и отправит вместе с другой информацией, такой как имя, адрес электронной почты и т.д. Когда пользователь нажмет на кнопку, вся информация из формы будет загружена в значение объект. Для файла изображения я установил его как byte[]
.
Итак, предполагая:
public String name;
public String email;
public byte[] logo;
Я также установил сервлет, чтобы обработать представление, но я не уверен, как начать. Как работает загрузка? Когда пользователь отправляет, как мне получить информацию для изображения? Вот скриншот: http://imageshack.us/f/32/77675354.png/ Мне нужно преобразовать это изображение и сохранить его в byte[]
, а затем преобразовать в blob, чтобы я мог вставить его в таблицу.
Ответы
Ответ 1
Для части загрузки файла вам нужно установить enctype="multipart/form-data"
в HTML-форму, чтобы веб-браузер отправил содержимое файла, и вы хотите использовать метод request.getPart()
в сервлет doPost()
, чтобы получить файл как a InputStream
. Пример конкретного кода см. Также Как загрузить файлы на сервер с помощью JSP/Servlet?
Затем, чтобы сохранить этот InputStream
в БД, просто используйте PreparedStatement#setBinaryStream()
на BLOB
/varbinary
/bytea
или любой столбец представляет "двоичные данные" в вашем любимом модуле БД.
preparedStatement = connection.prepareStatement("INSERT INTO user (name, email, logo) VALUES (?, ?, ?)");
preparedStatement.setString(1, name);
preparedStatement.setString(2, email);
preparedStatement.setBinaryStream(3, logo);
// ...
Вам не обязательно преобразовывать этот InputStream
в byte[]
, он также не был бы эффективным с точки зрения памяти. Представьте себе, что 100 пользователей одновременно загружают изображения размером 10 МБ, а затем 1 ГБ серверной памяти будет выделено в этой точке.
Ответ 2
Вероятно, вы не должны хранить изображение в базе данных. База данных является самым дорогим местом, где вы можете хранить двоичные данные. Размер БД будет быстро расти, а стоимость запросов высока. Возможно, вы получите немасштабируемое и малоэффективное решение для хостинга изображений.
Храните его на отдельном сервере ресурсов, например, Amazon S3 или где-либо еще (локальный Nginx, Tomcat и т.д.).
Вместо этого вы можете хранить уникальные имена файлов и/или полный путь к файлу. Таким образом, вы будете облегчать загрузку данных БД и данных столбцов, чтобы вы могли быстро найти нужную картинку. Я даже не говорю о производительности в целом, простой тест легко докажет это.