【问题标题】:Play Framework Image BLOB File for Test Object Yaml播放测试对象 Yaml 的框架图像 BLOB 文件
【发布时间】:2023-04-09 03:28:01
【问题描述】:

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

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

【问题讨论】:

标签: java mysql blob playframework yaml


【解决方案1】:

嗯,在这一点上玩很奇怪。

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

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

【讨论】:

    【解决方案2】:

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

    在数据库中,它被存储为一个字符串(大多数数据库中为 varchar),包含两个组件:名称和 mime 类型。它看起来像:

    12345asbcdefghi12345abcdfed|image/jpeg
    

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

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

    你可以看到代码here

    【讨论】:

    • 那么您将如何在 yaml 文件中映射图像/BLOB:用户(john):名称:“John Smith”电子邮件:john@john.com 语言:es 图像:文件名|图像/jpeg谢谢
    • 尝试在 cmets 中获取换行符非常糟糕,希望您能理解没有换行符的语法。
    • 好吧,老实说我从未尝试过,但知道它是作为 varchar 存储的,添加 filname|myme-type 应该可以。
    • 我确认你的观点,Pere,文件名丢失了。您必须手动保存它。 Lunatech 写了一篇关于它的好文章:lunatech-research.com/playframework-file-upload-blob
    【解决方案3】:

    我不久前在一个项目中遇到过同样的问题。但是,由于我找不到使用固定装置解决此问题的方法(因为数据库将 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());
                }
            }
        }
    }
    

    如果数据库中没有存储“项目”,我要做的第一件事是用初始数据填充数据库。
    第二件事是遍历所有播放的“项目”!刚刚存储在数据库中,从“my_fixtures.yml”文件中读取。在这里,对于每个项目,字符串字段都将得到更新,如上例所示。

    我知道这并不完全是 OP 中问题的答案,但它提供了一些解决这个问题的好主意..

    编辑:在上面给出的示例中,我假设图片是手动上传到您的 application.conf 中给出的附件文件夹,并且每个图像名称类似于:“item_ ”,带有“.png”扩展名

    【讨论】:

    • 我仍然在 Blob 的字段中看到空值,即使在将图像文件放入数据文件夹并执行上面的更新代码之后。
    • 更正:当我尝试在 doJob() 方法中再次读取图像时,我没有看到 blob 的任何字段,所以我认为这不起作用。但是,当我稍后在 Controller 中执行相同操作时,图像是正确的,并且我设法在浏览器中正确呈现它!
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      相关资源
      最近更新 更多