【问题标题】:Silverstripe UploadField upload multiple image but not all at same timeSilverstripe UploadField 上传多张图片但不是同时上传
【发布时间】:2016-07-07 19:54:19
【问题描述】:

我想知道是否有UploadField 的扩展允许同时上传120 张图片?这会导致 I/O 服务器出现无法响应过度使用的问题。那么如何一次排队一张图片呢?我不想一张一张上传图片。某处的模块或一段代码?

在我的项目中添加了 GridFieldBulkEditingTools:

private static $many_many = array(
    'Images' => 'Image',
);

...

    $gridFieldConfig->addComponent(new GridFieldSortableRows('SortOrder'));
    $gridFieldConfig->getComponentByType('GridFieldBulkUpload')
        ->setUfSetup('setFolderName', 'Uploads/Images/Rubriques/Galerie')
        ->setUfConfig('sequentialUploads', true);
    $gridfield = new GridFieldBulkUpload("Images", "Images", $this->Images()->sort("SortOrder"), $gridFieldConfig);

结果...空白页。

【问题讨论】:

标签: php upload silverstripe


【解决方案1】:

您可以使用 GridField 管理 has_manymany_many,并借助 BulkEditingTools 一次上传大量图像。

我通常会制作一个额外的 DataObject 来保存与其他信息(翻译的标题、版权信息等)的图像关系,例如:

<?php
class GalleryPic extends DataObject
{
    private static $db = array(
        'Title' => 'Text',
        'Description' => 'Text',
        'Copyright' => 'Text',
        'SortOrder' => 'Int'
    );

    private static $has_one = array(
        'Attachment' => 'Image',
        'ResourcePage' => 'Page'
    );

    public function getCMSFields()
    {
        $fields = new FieldList(
            TextField::create('Title', 'Title'),
            TextareaField::create('Description', 'Desc.'),
            TextField::create('Copyright', 'Copyright / Source'),
            $imageField = UploadField::create('Attachment')
        );
        $imageField->setAllowedFileCategories('image');
        $imageField->setAllowedMaxFileNumber(1);

        return $fields;
    }
}

然后我有一个 DataExtension,它将 has_many 插入任何页面类型或数据对象:

<?php

class PageGallery extends DataExtension
{
    private static $has_many = array(
        'Gallery' => 'GalleryPic'
    );

    function updateCMSFields(FieldList $fields)
    {
        $conf = GridFieldConfig_RecordEditor::create(10);
        $conf->addComponent(new GridFieldSortableRows('SortOrder'));
        $conf->addComponent(new GridFieldGalleryTheme('Attachment'));
        $conf->addComponent(new GridFieldBulkUpload());
        //set upload folder if folderperroot extension is installed...
        if ($this->owner->hasMethod('getRootFolderName')) {
            $conf->getComponentByType('GridFieldBulkUpload')->setUfSetup('setFolderName', $this->owner->getRootFolderName());
        }
        $fields->addFieldToTab("Root.Bilder", Gridfield::create('Gallery', 'Gallery', $this->owner->Gallery(), $conf));

        return $fields;
    }

使用 config yml api 将其添加到您的页面(例如添加到名为 MyPage 的类):

MyPage:
  extensions:
    - 'PageGallery'

您的画廊上传网格字段位于 CMS 的单独选项卡中。

我想你知道如何在模板中循环$Gallery 关系。

需要使用 composer 安装这些模块才能使上述示例正常工作:

【讨论】:

  • 我找到了另一个模块来执行此操作:chunkeduploadfield github.com/micschk/silverstripe-chunkeduploadfield。 Juste 在文档中更改此行 $sizeMB = .05 * 1024 * 1024; // 50 KB(以字节为单位),运行良好且不会导致服务器崩溃。
【解决方案2】:

我建议使用这个模块,因为它可以很好地处理多次上传...我承认我没有尝试过 120 个项目,但我相信它是最好的选择。

https://github.com/unclecheese/silverstripe-dropzone

“Dropzone 模块提供 FileAttachmentField,这是一个用于 SilverStripe 的强大的 HTML5 上传接口,允许表单将文件上传保存到 DataObject 实例。”

【讨论】:

  • 拖动超过100张图片全部一张一张上传?
  • 我没有看到像“setFolderName”这样的选项来将文件放到特定文件夹中。
  • 抱歉,我不再赘述,我建议将其作为上传大量文件的解决方案,但最终选择权在您。如果这个答案没有帮助,我很抱歉 - 如果是这种情况,请等待其他答案。
  • 我明白了,这是一次很棒的尝试,而且很有帮助!但不是我使用的最佳选择。不要抱歉,感谢您的帮助
  • 由于这个 Field 是 FileField 的子类(参见 github.com/unclecheese/silverstripe-dropzone/blob/master/code/… ),您可以使用 FileField 为您提供的所有内容...api.silverstripe.org/3.3/class-FileField.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-31
  • 1970-01-01
  • 1970-01-01
  • 2019-11-15
  • 1970-01-01
相关资源
最近更新 更多