使用MYSQL blob类型上传图像

时间:2011-02-18 19:47:01

标签: mysql playframework

假设我有这个模型:

@Entity
public class Picture extends Model {
  public Blob image;
  ...
}

当我查看mysql数据库中的类型时,它只是附件文件夹(VARCHAR)的路径。有没有办法改变这个以使用播放将二进制数据保存到mysql(BLOB)?

我想实现这个目标:

CREATE TABLE picture (             
             ......
              image blob,                         
            ...        
 );

使用JDBC设置图像:

“psmnt.setBinaryStream(3,(InputStream)fis,(int)(image.length()));”

我不知道这是否有意义,但如果没有,请解释我原因!为什么有附件文件夹进入游戏项目?

2 个答案:

答案 0 :(得分:3)

好吧,因为存储媒体文件(图像/视频/音频/等等)非常罕见(在数据库中),我猜测团队放置了Blob实现以使其更“有效”而不是获取二进制文件数据库(数据库将受到较少的打击)。说实话,我从来没有使用Blob功能,我知道你可以实现自己的Blob并阅读一些关于它的帖子。

http://groups.google.com/group/play-framework/browse_thread/thread/7e7e0b00a48eeed9

像Guillaume说的那样,Blob是1.1版之前使用的“文件附件”类的新版本。如果您想存储图像并且正在使用休眠

@Entity
public class Picture extends Model {

  @Lob(type = LobType.BLOB)
  public byte[] image;
  ...
}

答案 1 :(得分:2)

在Play中,Blob类型仅存储对文件的哈希引用及其mime类型。原因是数据库不喜欢太多的大Blob(出于内部原因),将文件存放在一边是一个很好的做法。它还可以避免与编码和备份相关的麻烦,相信我(更重要的是,相信Play开发人员!)

作为替代方案,您可以将图像存储为:

@Entity
public class YourClass extends Model {

  @Basic(fetch = FetchType.LAZY)
  @Lob
  public byte[] image;

  public String mime_type;
  public String file_name;    
}

您需要单独存储mime类型(Blob类型将其存储在字段中的数据库中)才能使用该文件,并且您可能希望存储提供给您的原始文件名。要检测mime类型,我建议使用mime-util

作为最后一点,请注意,如果您使用Play的Blob,当您删除该字段(通过CRUD或API)时,该文件不会从文件系统中删除。您需要创建一个不时检查未使用文件的作业,以释放空间。

由于无法在数据库和文件系统之间进行安全的两阶段事务,因此会发生这种情况(用Gillaume的话说)。这是相关的,因为根据您的应用程序,您可能会发现文件系统被未使用的图像填满:)