BLOB-файл Play Framework Image для тестового объекта Yaml - PullRequest
5 голосов
/ 03 августа 2011

Как настроить образ тестового блоба с использованием структуры yaml?

Кроме того, какова структура базы данных для BLOB-файла?(MySQL)

Ответы [ 4 ]

3 голосов
/ 14 сентября 2011

Я недавно столкнулся с такой же проблемой в проекте.Однако, так как я не смог найти способ решить эту проблему с помощью приборов (поскольку база данных хранит объект 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 , и что каждое имя изображения имеет вид:"вещь_"с расширением" .png "

1 голос
/ 03 августа 2011

BLOB-объект сохраняется в файловой системе, по умолчанию в разделе «данные / вложения», если я правильно помню, но вы можете изменить это в конфигурации (application.conf)

В базе данных она хранится в виде строки (varchar в большинстве БД) с двумя компонентами: именем и типом mime. Похоже:

12345asbcdefghi12345abcdfed|image/jpeg

Первая часть - это имя файла. При загрузке файла Play генерирует уникальный UUID в качестве имени, чтобы избежать столкновения. Да, это означает, что вы теряете оригинальное имя. (примечание: теперь у меня есть сомнения по поводу названия, я бы поклялся, что оно потеряно, но я могу ошибаться!)

Вторая часть (после |) - это тип myme. Play использует библиотеку magic-myme для ее автоматического обнаружения.

Вы можете увидеть код здесь .

1 голос
/ 03 августа 2011

Ну, игра довольно странная в этом отношении.

BLOB-объект не сохранен в базе данных, но находится в папке загрузки , определенной в вашем application.conf. Это путь к файлу, который сохраняется в базе данных.

Я не могу проверить это прямо сейчас, но мне кажется, что они сохраняются в виде текстовых представлений (VARCHAR, TEXT)

0 голосов
/ 27 августа 2012

Вот модифицированная версия ответа 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;
          }
        }
      }
    }
  }
}
...