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

时间:2013-04-24 05:59:14

标签: java mysql jsp struts2 struts2-jquery

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

我正在使用三个班级:

  1. 模型类
  2. 使用预准备语句插入查询的DAO类。
  3. 行动类
  4. 在JSP中我使用s:file标记。

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

    在数据库中,我使用blob type来存储图像,是不是?如果没有,请给我建议。 如何使用Srtuts2在数据库中插入图像?

2 个答案:

答案 0 :(得分:4)

要将文件上传到Struts2,您已使用Struts2 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 :(得分: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.Blobjava.sql.Clob类型来编写数据以保存在数据库中,类型应该对应于数据库字段类型,即blob用于blob,CLOB用于clobs等。您从db中再次检索数据,将使用相同的java sql类型将数据转换回来。现在问题是,如果要将该值保留在要用数据库数据填充的模型中,有两个选项:

  1. 保持数据不变,即java.sql.Blob
  2. 将其转换为byte[]
  3. 对于第二个选择,您需要byte[] data = getBytes(File file)之类的内容来打开流并从文件中读取数据,或者如果您有Blob,则使用blob.getBytes(pos, length)

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

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

    使用您可以找到herethere的JDBC API将blob存储到数据库的示例。 here也有很好的例子。