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

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

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

Другие вопросы по тегам