2012-02-02 28 views
0

嗨,我建立一个动态的Web项目,其中欢迎页有struts2文件标记现在我想存储指定的文件到MySQL数据库会有人帮助我...如何将图像从浏览器存储到mysql数据库使用struts 2和休眠

在此先感谢。

这是我开发的代码,但它需要文件参数静态意味着手动我指定路径。但它应该采取的路径从Struts的文件标签看到Java类U将得到它..

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

}

+0

你的问题是不明确的all.add更多细节,使一些人可以帮你。 – 2012-02-02 10:20:00

回答

0

你应该在表中的图像形式存储的BLOB类型。假设你有一个Person类,存储在DB中的人的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
0

那么你不需要手动做到这一点,当你将在文件中使用的Struts2上传的文件,它的构建上装载拦截器会做主要令人振奋。 您只需在动作类中指定一些属性,以便Framework将动作类中的require数据注入,并且可以执行其他工作。

这里是你必须do.In你的JSP页面,您需要使用<s:file>标签

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

的文件上传拦截器将使用setter注入到上传的文件和相关数据插入到你的Action类的东西。对于命名上传表单字段中,您将提供在下面的例子中所示的三个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

+0

很好,我明白了,但你可以告诉我如何在execute()方法中将该文件[该文件是图像文件]保存到mysql数据库中。在Mysql数据库中表名是PICTURE和列名是BLOB DataType的图像... – user1184777 2012-02-04 04:36:44

+0

@ user1184777:如何在数据库中保存图像已在其他文章中定义 – 2012-02-04 04:43:23

相关问题