1

我正在使用 SilverStripe 2.4.7,我想添加一个方法来解析我刚刚使用 FileIFrameField 上传的文件。让我难过的是把这个放在哪里。我在考虑 onAfterWrite 方法,但文件只有在其余字段第一次保存后才会上传,所以我不确定这是否可行。

我的问题是:这种事情的最佳做法是什么?

编辑

我有这行代码,其中 $filename 是我上传文件的路径,但我不断收到“没有这样的文件或目录错误”。我什至尝试在文件路径中进行硬编码,但得到了同样的错误。

$fh = fopen($filename, 'r');
4

1 回答 1

1

解析新文件的最佳方法是挂钩到 uploadfield 保存方法,对于 FileIframeField 你可以通过子类化并覆盖 save()

(在 SilverStripe 3 中有一个名为 UploadField 的新类,在 UploadField 中您需要覆盖UploadField->upload(SS_HTTPRequest $request),并且那里的文件可以像这样访问$tmpfile = $request->postVar($this->getName());:)

下面,以及如何在 FileIframeField 中执行此操作的示例:

class myFileIFrameField extends FileIFrameField {
    public function save($data, $form) {
        if (
            !isset($data['FileSource'])
            || ($data['FileSource'] == 'new' && (!isset($_FILES['Upload']) || !$_FILES['Upload']))
            || ($data['FileSource'] == 'existing' && (!isset($data['ExistingFile']) || !$data['ExistingFile']))
        ) {
            $form->sessionMessage(_t('FileIFrameField.NOSOURCE', 'Please select a source file to attach'), 'required');
            Director::redirectBack();
            return;
        }
        $fileContent = false;
        if($data['FileSource'] == 'new') {
            $fileContent = file_get_contents($_FILES['Upload']['tmp_name']);
        }
        elseif($data['FileSource'] == 'existing') {
            $fileObject = DataObject::get_by_id('File', $data['ExistingFile']);
            $fileContent = file_get_contents($fileObject->getFullPath());
        }
        if ($fileContent) {
            // parse the $fileContent here
        }
        // if you want to still save the file into a relation, 
        //meaning if you want to have the actually FileIframeField behaviour still in tact then call 
        return parent::save($data, $form);
        // other wise, if you do not want to save the relation and you don't want to save the file to the server
        // thenn do NOT call parent::save, just do:
        // Director::redirectBack();
    } 
}
于 2012-10-06T09:23:07.937 回答