2

在 SS4 中动态创建文件显然要复杂一些

$folder = Folder::find_or_make('Cards');
$filename = 'myimage.jpg';
$contents = file_get_contents('http://example.com/image.jpg');
$pathToFile = Controller::join_links(Director::baseFolder(), ASSETS_DIR, $folder->Title, $filename);
file_put_contents($pathToFile, $contents);

$image = Image::create();

$image->ParentID = $folder->ID;
$image->Title = "My title";
$image->Name = $filename;
$image->FileFilename = 'Cards/' . $filename;
$image->write();

Member::actAs(Member::get()->first(), function() use ($image, $folder) {
    if (!$image->isPublished()) {
        $image->publishFile();
        $image->publishSingle();
    }
    if (!$folder->isPublished()) {
        $folder->publishSingle();
    }
});

以上,按预期创建文件/assets/Cards/myimage.jpg并正常发布

但是所有预览都是空白的,因此显然找不到文件:

所有预览都是空白的

知道我在创建Image对象时错过了什么吗?

4

1 回答 1

4

这应该有效:

$folder = Folder::find_or_make('Cards');
$contents = file_get_contents('http://example.com/image.jpg');

$img = Image::create();
$img->setFromString($contents, 'image.jpg');
$img->ParentID = $parent->ID;
$img->write();

// This is needed to build the thumbnails
\SilverStripe\AssetAdmin\Controller\AssetAdmin::create()->generateThumbnails($img);
$img->publishSingle();

仅供参考:$img->Filename不再存在。一个ImageorFile对象有一个File属性,它是一个类型为 的复合字段DBFile。这个复合字段包含文件名、哈希和一个变体……所以你应该使用复合字段来处理这些字段。

于 2018-02-08T10:26:18.163 回答