如何使用struts 2和hibernate将从浏览器中获取的图像存储到mysql数据库中

时间:2012-02-02 10:12:12

标签: database image hibernate struts2

您正在构建一个动态Web项目,其中欢迎页面有struts2文件标签现在我想将该指定文件存储到mysql数据库中,有人会帮助我...

提前致谢。

这是我开发的代码,但它采用文件参数静态意味着我手动指定路径。但它应该从struts 2文件标签中获取路径,看看java类你会得到它..

public class FileUploadACtion 
{

    public String execute() throws IOException
{
System.out.println("Hibernate save image into database");
    Session session = HibernateUtil.getSessionFactory().openSession();

    session.beginTransaction();

    //save image into database
    File file = new File("C:\\mavan-hibernate-image-mysql.gif");
    byte[] bFile = new byte[(int) file.length()];

    try {
     FileInputStream fileInputStream = new FileInputStream(file);
     //convert file into array of bytes
     fileInputStream.read(bFile);
     fileInputStream.close();
    } catch (Exception e) {
     e.printStackTrace();
    }

    FileUpload tfile = new FileUpload();
    avatar.setImage(bFile);

    session.save(tfile);

    //Get image from database
    FileUpload tfile2 =         (FileUpload)session.get(FileUpload.class,FileUpload.getAvatarId());
    byte[] bAvatar = avatar2.getImage();
    try{
        FileOutputStream fos = new FileOutputStream("C:\\test.gif"); 
        fos.write(bAvatar);
        fos.close();
    }catch(Exception e){
        e.printStackTrace();
    }

    session.getTransaction().commit();
}

}

2 个答案:

答案 0 :(得分:0)

您应该将图像作为BLOB类型存储在表中。假设您有一个Person类,其中image个人存储在数据库中。如果您想要映射它,只需在保存图像的人POJO中添加一个属性。

@Column(name="image")
@Blob
private Blob image;

当您显示它时,将其转换为byte[]并显示。

private byte[] toByteArray(Blob fromImageBlob) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try {
      return toByteArrayImpl(fromImageBlob, baos);
    } catch (Exception e) {
    }
    return null;
  }



private byte[] toByteArrayImpl(Blob fromImageBlob, 
      ByteArrayOutputStream baos) throws SQLException, IOException {
    byte buf[] = new byte[4000];
    int dataSize;
    InputStream is = fromImageBlob.getBinaryStream(); 

    try {
      while((dataSize = is.read(buf)) != -1) {
        baos.write(buf, 0, dataSize);
      }    
    } finally {
      if(is != null) {
        is.close();
      }
    }
    return baos.toByteArray();
  }

您可以查看以下示例以了解有关它的更多信息。

  1. http://i-proving.com/space/Technologies/Hibernate/Blobs+and+Hibernate
  2. http://snehaprashant.blogspot.com/2008/08/how-to-store-and-retrieve-blob-object.html
  3. http://viralpatel.net/blogs/2011/01/tutorial-save-get-blob-object-spring-3-mvc-hibernate.html

答案 1 :(得分:0)

嗯,你不需要手动执行此操作,当你使用Struts2上传文件时,它在文件up-loader拦截器中的构建将为你做主要的提升。 您只需要在操作类中指定一些属性,这样Framework就会在您的操作类中注入require数据,您可以执行其他工作。

这是你必须做的。在JSP页面中你需要使用<s:file>标签

<s:form action="doUpload" method="post" enctype="multipart/form-data">
    <s:file name="upload" label="File"/>
    <s:submit/>
</s:form>

fileUpload拦截器将使用setter注入将上传的文件和相关数据插入到Action类中。对于名为upload的表单字段,您将提供以下示例中显示的三个setter方法: 在你的动作课中,这就是你所要做的一切

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;
      }
 }

上传的文件将被视为临时文件,具有较长的随机文件名,您必须在操作类execute()方法中复制它。您可以获取FileUtils的帮助。

我建议您阅读Struts2的官方文件上传文档,了解完整配置Struts2 File-upload