如何使用 Struts 2 <s:file> 标签在数据库中插入图像

Posted

技术标签:

【中文标题】如何使用 Struts 2 <s:file> 标签在数据库中插入图像【英文标题】:How to insert image in database using Struts 2 <s:file> tag 【发布时间】:2013-04-17 13:22:50 【问题描述】:

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

我正在使用三个类:

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

在 JSP 中,我使用 &lt;s:file&gt; 标签。

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

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

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

【问题讨论】:

【参考方案1】:

为了将文件上传到 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);

【讨论】:

我很确定这三个参数需要具有相同的前缀(struts.apache.org/release/2.3.x/struts2-core/apidocs/org/apache/…)并且文件名的 N 必须大写:然后是 filefileContentTypefileFileName @AndreaLigios 虽然我有点同意你的观点,但我只是从struts.apache.org/release/2.3.x/docs/file-upload.html 获取了代码 sn-p 并且更多超过 OP 可以处理这个 我没有注意到 Setter 与变量名不同...然后它的工作原理是这样的,但它不符合 Javabeans :/ 文档中的奇怪示例 :) @AndreaLigios:同意你的观点,即使我只是复制了该代码,相信一切都可以:)【参考方案2】:

使用fileUpload interceptor,当您提交包含&lt;s:file&gt; 标签和能够传输到服务器的值数据的表单时,您可以将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.Blobjava.sql.Clob类型写入数据保存在数据库中,类型应该对应于数据库字段类型,即BLOB代表blob,CLOB代表clob等。当你检索数据时再次从 db 中使用相同的 java sql 类型将数据转换回来。

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

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

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

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

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

使用 JDBC API 将 Blob 存储到数据库的示例,您可以找到 Adding and Retrieving BLOB Objects。

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

【讨论】:

以上是关于如何使用 Struts 2 <s:file> 标签在数据库中插入图像的主要内容,如果未能解决你的问题,请参考以下文章

Struts2 实现文件上传和下载

Struts2:上传下载

struts2中的s:file标签怎么限定上传文件为图片类型,最好是能在选择文件时就只能选择图片文件

在 Struts 2 中一一上传文件

Java文件下载怎么实现的

如何对checkboxlist使用XML验证并在JSP上的Struts 2中选择?