如何使用Struts 2<s:file>标签将图像文件插入数据库?

问题描述 投票:0回答:2

我想将图像文件插入到 Struts 2 应用程序中的数据库中。

我正在使用三个类:

  1. Model
    班级
  2. DAO 类使用准备好的语句插入查询。
  3. Action
    班级

在 JSP 中我使用

<s:file>
标签。

我的问题是:

我需要使用什么类型的

Model
类私有变量?

在数据库中我使用

BLOB
类型来存储图像,对吗?如果没有,请给我建议。

如何使用Struts 2向数据库插入图片?

java mysql jsp file-upload struts2
2个回答
4
投票

要将文件上传到 Struts 2,您已经在使用 Struts 2 FileUpload Interceptor,并且您需要在操作或模型类中定义这些字段

public class UploadAction extends ActionSupport {
      private File file;
      private String contentType;
      private String filename;

      public void setUpload(File file) {
         this.file = file;
      }

      public void setUploadContentType(String contentType) {
         this.contentType = contentType;
      }

      public void setUploadFileName(String filename) {
         this.filename = filename;
      }

      public String execute() {
         //...
         return SUCCESS;
      }
 }

您可以通过类似

的方式将
File
数据转换为
byteArray

IOUtils.toByteArray(InputStream input);

并可以通过类似

 的方式将其保存为 
Blob

在数据库中
Blob blob = connection.createBlob();
blob.setBytes(1, bytes);

1
投票

使用

fileUpload
拦截器,当您提交包含
File
标签和能够传输到服务器的值数据的表单时,您可以将
<s:file>
对象放入您的操作中。如果上传成功,则您可以从本地存储读取服务器上的数据,即
java.io.tempdir
可用于设置本地存储的位置。然后你需要读取文件的内容

File file; //this is uploaded file

FileInputStream is = new FileInputStream(file);
byte[] data = new byte[is.available()];
is.read(data);
is.close();

然后您可以使用

java.sql.Blob
java.sql.Clob
类型写入数据保存在数据库中,类型应与数据库字段类型相对应,即 blob 为 BLOB,clob 为 CLOB 等。当您再次从以下位置检索数据时数据库将使用相同的 java sql 类型将数据转换回来。

现在回答您的问题,如果您想将该值保留在要使用数据库数据填充的模型中,有两个选项:

  1. 保持数据不变,即
    java.sql.Blob
  2. 将其转换为
    byte[]

对于第二个选择,您需要类似

byte[] data = getBytes(File file)
的东西来打开流并从文件中读取数据,或者如果您有
Blob
,则使用
blob.getBytes(pos, length)

在处理流的第一个选择中,使用

Blob
s
setBinaryStream(pos) 
获取输出流以写入上传的文件数据,或使用
getBinaryStream()
从数据库检索数据。

在大多数情况下,您应该使用第二个选择,直到您有足够的理由使用第一个选择。

使用 JDBC API 将 Blob 存储到数据库的示例,您可以找到添加和检索 BLOB 对象

在数据库表中插入图像也有很好的例子。

© www.soinside.com 2019 - 2024. All rights reserved.