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

时间:2018-06-10 11:18:30

标签: java html sql spring

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

因此,我被要求将图像文件保存到数据库,但由于DB没有图像文件数据类型,我必须使用multipart。有人可以向我解释它是如何工作的?我该怎么办?如何检索数据然后再将其转换为图像?我找不到可以帮助我的文章,如果有的话,请随意评论。感谢。

2 个答案:

答案 0 :(得分:2)

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

  1. 如何使用JSP上传媒体
  2. 如何在DB中存储图像
  3. 这个问题已在本网站上多次回答,但在下面您可以在一个地方找到一些说明。因为您没有提供有关您使用哪个数据库的信息,所以我将解释如何在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

    希望这有助于您理解这个主题。

答案 1 :(得分:0)

请注意,在浏览网页寻找答案后我发布了这个,但我没有得到我需要的内容。

@Column(name = "IMAGE")
public byte[] getImage() {
    return image;
}

public void setImage(byte[] image) {
    this.image = image;
}

@Column(name = "CONTENT_TYPE")
public String getContentType() {
    return contentType;
}

public void setContentType(String contentType) {
    this.contentType = contentType;
}
@Transient
public String getIconImage() {
    return "data:" + getContentType() + ";base64,"
            + Base64.encode(getImage());
}

我使用了瞬态标记来表示multipart将被传递的路径。然后用

从控制器中获取零件
<img src "${iconImage}"/>

如果要从数据库中显示图像。只需使用正常 getIconImage()然后将PURCHASE从您的实体模型传递给Controller。