如何使用yaml结构设置测试Blob图像?
另外,BLOB文件的数据库结构是什么? (MySQL的)
答案 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;
}
}
}
}
}
}