<form:form id="companyForm" enctype="multipart/form-data" method="POST"
action="/DTR/secured/admin/company/save" commandName = "command">
因此,我被要求将图像文件保存到数据库,但由于DB没有图像文件数据类型,我必须使用multipart。有人可以向我解释它是如何工作的?我该怎么办?如何检索数据然后再将其转换为图像?我找不到可以帮助我的文章,如果有的话,请随意评论。感谢。
答案 0 :(得分:2)
您可能应该阅读有关此类型BLOB
的更多信息。
您的问题结合了两个主题:
这个问题已在本网站上多次回答,但在下面您可以在一个地方找到一些说明。因为您没有提供有关您使用哪个数据库的信息,所以我将解释如何在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();
}
}
}
}
希望这有助于您理解这个主题。
答案 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。