3

我想在 Struts 2 应用程序的数据库中插入图像;

我正在使用三个类:

  1. 模型类
  2. DAO 类使用准备好的语句插入查询。
  3. 动作类

在 JSP 中,我使用的是<s:file>tag 。

我的问题是:我需要使用什么类型的模型类私有变量?

在数据库中我使用BLOB类型来存储图像,对吗?如果没有请给我建议。

如何使用 Srtuts 2 在数据库中插入图像?

4

2 回答 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);
于 2013-04-24T06:50:23.917 回答
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.Blobor java.sql.Clobtype 写入数据保存在数据库中,类型应该对应于数据库字段类型,即BLOB代表blob,CLOB代表clob等。当你再次从db中检索数据时,相同的java sql类型将用于将数据转换回来。

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

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

对于第二个选择,您需要byte[] data = getBytes(File file)打开一个流并从文件中读取数据,或者如果您已经Blob使用blob.getBytes(pos, length).

在您处理流的第一个选择中,使用BlobssetBinaryStream(pos) 获取输出流以写入上传的文件数据,或getBinaryStream()从数据库中检索数据。

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

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

Inserting Image in Database Table也有很好的例子。

于 2013-04-24T13:06:49.863 回答