Как загрузить изображение и сохранить его в базе данных?
Мне нужно создать форму с использованием JavaScript, и пользователь будет загружать файл JPG и отправлять вместе с другой информацией, такой как имя, адрес электронной почты и т. Д. Когда пользователь нажимает кнопку "Отправить", вся информация из формы будет загружена в объект значения. Для файла изображения я установил его byte[]
,
Итак, предполагая:
public String name;
public String email;
public byte[] logo;
Я также настроил сервлет для обработки отправки, но я не уверен, с чего начать. Как работает загрузка? Когда пользователь отправляет, как я могу получить информацию для изображения? Вот снимок экрана: http://imageshack.us/f/32/77675354.png/ Мне нужно преобразовать это изображение и сохранить его в byte[]
затем конвертировать в blob, чтобы я мог вставить его в таблицу.
2 ответа
Для части загрузки файла необходимо установить enctype="multipart/form-data"
в форме HTML, так что веб-браузер отправит содержимое файла, и вы хотели бы использовать request.getPart()
в сервлете doPost()
метод, чтобы получить файл как 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 ГБ памяти сервера.
Вы, вероятно, не должны хранить изображение в базе данных. База данных буквально самое дорогое место, где вы можете хранить двоичные данные. Размер БД будет быстро расти, а стоимость запросов высока. Вы можете получить не масштабируемое и едва эффективное решение для хостинга изображений.
Храните его на отдельном сервере ресурсов, например, Amazon S3 или где-либо еще (локальный Nginx, Tomcat и т. Д.).
Вместо этого вы можете хранить уникальные имена файлов и / или полный путь к файлу. Таким образом, вы упростите загрузку БД, и данные столбцов будут доступны для чтения, поэтому вы сможете быстро найти нужную картинку. Я даже не говорю о производительности в целом, простой тест легко это докажет.