java - 如何使用 JAVA 将图像从 HTML 保存到数据库

标签 java html sql spring

<form:form id="companyForm" enctype="multipart/form-data" method="POST"
  action="/DTR/secured/admin/company/save" commandName = "command">

因此,我被要求将图像文件保存到数据库中,但由于数据库没有图像文件数据类型,我必须使用多部分。有人可以向我解释它是如何工作的吗?我要怎么做呢?如何检索数据然后将其再次转换为图像?我找不到可以帮助我的文章,如果有,请随时发表评论。谢谢。

最佳答案

您可能应该阅读有关 BLOB 等类型的更多信息。 您的问题结合了两个主题:

  1. 如何使用 JSP 上传媒体
  2. 如何在数据库中存储图像

这两个问题已在此网站上多次得到解答,但您可以在下面的一个地方找到一些说明。因为您没有提供有关您使用哪个数据库的信息,所以我将解释如何使其在 Oracle 中工作。

1.首先您需要在oracle中创建新用户。您可以在下面找到用于创建 TEST 用户的 sql 脚本。

CREATE USER TEST IDENTIFIED BY TEST DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP PROFILE DEFAULT ACCOUNT UNLOCK;
GRANT CONNECT, RESOURCE, IMP_FULL_DATABASE, CREATE VIEW, UNLIMITED TABLESPACE, CREATE JOB TO TEST;

2.然后您需要创建一个包含image列的表来存储您的图像

create table test.image_storage (image blob);

3.创建 JSP 并创建用于上传图像的表单:

<form action="upload" method="post" enctype="multipart/form-data">
        <input type="text" name="description" />
        <input type="file" name="file" />
        <input type="submit" />
</form>

4.注册您的 servlet:

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

@WebServlet("/upload")
@MultipartConfig
public class UploadServlet extends HttpServlet {

    public static final String QUERY = "INSERT INTO IMAGE_STORAGE (IMAGE) VALUES (?)";
    public static final String CONNECTION_URL = "jdbc:oracle:thin:@localhost:1522:orcl";
    public static final String USER_NAME = "TEST";
    public static final String USER_PWD = "TEST";
    public static final String FILE_PARAMETER = "file";

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Part filePart = request.getPart(FILE_PARAMETER);
        InputStream fileContent = filePart.getInputStream();
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
        } catch (ClassNotFoundException e) {
            System.out.println("Oracle driver is absent?");
            e.printStackTrace();
        }

        Connection connection = null;
        try {
            connection = DriverManager.getConnection(
                    CONNECTION_URL, USER_NAME, USER_PWD);
            PreparedStatement statement = null;
            try {
                statement = connection.prepareStatement(QUERY);
                statement.setBlob(1, fileContent);
                statement.execute();
            } catch (SQLException e) {
                System.out.println("State cannot be executed!");
                e.printStackTrace();
                return;
            } finally {
                statement.close();
            }
        } catch (SQLException e) {
            System.out.println("Connection Failed!");
            e.printStackTrace();
            return;
        } finally {
            try {
                connection.close();
            } catch (SQLException e) {
                System.out.println("Connection cannot be closed?");
                e.printStackTrace();
            }
        }
    }
}

上传图像后,您将在数据库中看到一个新条目: enter image description here

希望这能帮助您理解这个主题。

关于java - 如何使用 JAVA 将图像从 HTML 保存到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50783126/

相关文章:

sql - 选择单行的多列作为数组元素

java - 用户需要按两次回车键才能初始化循环

java - 如何每天查看数据库字段?Cron作业?

html - 导航栏上列表项的奇怪放置 - BOOTSTRAP 4

javascript - 是否可以在窗口大小更改时自动更改组元素的大小?

mysql - 比较来自同一表和列的两组数据,而无需在 MySQL 中两次调用表

java - 重载 Hibernate 映射 POJO

java - Flink 中复杂拓扑(多输入)的集成测试

html - 为什么我的 div 也不能按照我想要的方式对齐,因为当我尝试定位它们时它们一直重叠

mysql - 我需要有关 MySQL 查询的帮助