Как загрузить изображение и сохранить его в базе данных?

Мне нужно создать форму с помощью 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 и т.д.).

Вместо этого вы можете хранить уникальные имена файлов и/или полный путь к файлу. Таким образом, вы будете облегчать загрузку данных БД и данных столбцов, чтобы вы могли быстро найти нужную картинку. Я даже не говорю о производительности в целом, простой тест легко докажет это.