播放测试对象Yaml的框架图像BLOB文件

时间:2011-08-03 15:13:34

标签: java mysql blob playframework yaml

如何使用yaml结构设置测试Blob图像?

另外,BLOB文件的数据库结构是什么? (MySQL的)

4 个答案:

答案 0 :(得分:3)

前一段时间我在项目中遇到过同样的问题。然而,由于我找不到使用fixture来解决这个问题的方法(因为数据库将blob对象存储为Pere上面解释的字符串),我创建了一个解决方法,至少在测试用例场景中解决了这个问题。我创建了以下文件/app/job/Bootstrap.java:

import play.test.*;
import play.jobs.*;
import play.db.DB;
import models.*;

import java.util.List;

@OnApplicationStart
public class Bootstrap extends Job {
     public void doJob() {
        // Load default data if the database is empty
        if(Item.count() == 0) {
            Fixtures.loadModels("my_fixtures.yml");
            List<Item> allItems = Item.findAll();
            for (Item a: allItems){
                DB.execute("UPDATE `Item` SET image='item_" + a.name.toLowerCase() + ".png|image/png' WHERE id=" + a.getId());
            }
        }
    }
}

如果数据库中没有存储“项目”,我首先要用初始数据填充数据库 第二件事是迭代所有播放的'Item'!只存储在数据库中,从“my_fixtures.yml”文件中读取。对于每个项目,字符串字段将更新,如上例所示。

我知道这不是OP中问题的答案,但是它可以解决这个问题。

编辑:在上面给出的示例中,我假设图片是手动上传到 application.conf 中给出的附件文件夹,并且每个图像名称都是:“item_&lt ; item_name_in_lowercase&gt;”中扩展名为“.png”

答案 1 :(得分:1)

那么,在这一点上玩很奇怪。

blob 未保存到数据库中,但在application.conf中定义的上传文件夹中。它是保存在数据库中的文件的路径。

我现在无法检查,但我似乎记得它们被保存为textuel表示(VARCHAR,TEXT)

答案 2 :(得分:1)

如果我没记错的话,blob会保存在文件系统中,默认情况下保存在“data / attachments”下,但您可以在配置中更改它(application.conf

在数据库中,它作为String(大多数数据库中的varchar)存储,包含两个组件:name和mime类型。它看起来像:

12345asbcdefghi12345abcdfed|image/jpeg

第一部分是文件的名称。上传文件时Play会生成一个唯一的UUID作为名称以避免冲突。是的,这意味着你丢失了原来的名字。 (注意:现在我对名字部分有疑问,我发誓它会丢失,但我可能错了!)

第二部分(在|之后)是myme类型。 Play使用magic-myme库自动检测它。

您可以看到代码here

答案 3 :(得分:0)

以下是Unji答案的修改版本,它会加载conf中文件夹中的图像,请注意我已删除所有导入语句:

/**
 * A job executed when the application starts.
 */
@OnApplicationStart
public class Bootstrap extends Job {

  /**
   * Loads the initial data if there are no
   * WebAdministrators at the database.
   * <p>
   *   It loads images on the post with the following criteria:
   *   <ol>
   *     <li>file loaction: /conf/initialMedia/</li>
   *     <li>file name: {post.title.toCamelCase()}-{i}.jpg</li>
   *   </ol>
   *   Where i must start in 0.
   * </p>
   */
  @Override
  public void doJob() {
    // Check if the database is empty
    if(WebAdministrator.count() == 0) {
      Logger.info("Loading Initial Data.");
      Fixtures.loadModels("initial-data.yml");
      List<Post> posts = Post.findAll();
      for (Post post: posts) {
        Logger.info("Looking for files for post: [" + post.title + "]");
        for (int i=0; true; i++) {
          VirtualFile vf = VirtualFile.fromRelativePath("/conf/initialMedia/"
              + JavaExtensions.camelCase(post.title) + "-" + i + ".jpg");
          File imageFile = vf.getRealFile();

          if (imageFile.exists()) {
            try {
              Blob blobImage = new Blob();
              blobImage.set(new FileInputStream(imageFile), MimeTypes.getContentType(imageFile.getName()));
              MediaItem mediaItem = new Image(blobImage);
              mediaItem.save();
              post.mediaItems.add(mediaItem);
              post.save();
              Logger.info("File: [%s] Loaded", imageFile.getAbsolutePath());
            } catch (FileNotFoundException e) {
              // this should never happen.
            }
          } else {
            Logger.info("Media Loaded for post [%s]: %d files.", post.title, i);
            break;
          }
        }
      }
    }
  }
}