2014-12-07 106 views

回答

3

如果你想以正确的方式做到这一点,你应该使用FAL来上传文件,而不是完全自己处理它。有关赫尔穆特胡梅尔的Extbase FAL上传的详细信息,请参阅here

Helmut还提供了一个演示扩展作为概念证明,可在Github上找到。

-2

Helmut Hummel的示例适用于Typo3 6.2,但不适用于8.x及更高版本。在自己的UploadViewHelper中删除方法调用的原因如getValue(false)

另一种没有自己的FileReference的方式是使用FileAbstractionLayer上传文件如下。

前端: 为您的模型类创建一个表单。 注:表格需要的属性方法= “邮报” ENCTYPE = “的multipart/form-data的”

<f:form action="addDownloadItem" method="post" enctype="multipart/form-data" object="{newDownloadItem}" name="newDownloadItem"> 
    <input type="file" property="file" name="datei"> 
</f:form> 

在你的控制器动作中写入以下代码:

public function addDownloadItemAction(DownloadItem $newDownloadItem, SubCategory $subCategory){ 

     $file = $_FILES['datei']; 

     $storage = $this->storageRepository->findAll()[0]; 
     $fileObject = $storage->addFile($file['tmp_name'], $storage->getDefaultFolder(), $file['name']); 
     $fileObject = $storage->getFile($fileObject->getIdentifier()); 

     $this->downloadItemRepository->add($newDownloadItem); 

     $fileResourceReference = new \TYPO3\CMS\Core\Resource\FileReference(array('uid_local' => $fileObject->getUid())); 

     /** @var \TYPO3\CMS\Extbase\Domain\Model\FileReference $fileSysReference */ 
     $fileSysReference = $this->objectManager->get(\TYPO3\CMS\Extbase\Domain\Model\FileReference::class); 
     $fileSysReference->setOriginalResource($fileResourceReference); 
     $fileSysReference->setPid($this->storagePid); 

     $newDownloadItem->setFile($fileSysReference); 

     $subCategory->addDownloadItem($newDownloadItem); 

     $this->subCategoryRepository->add($subCategory); 

} 

现在让我们看看模型类:

class DownloadItem extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity { 

/** 
* file 
* 
* @var \TYPO3\CMS\Extbase\Domain\Model\FileReference 
*/ 
protected $file = NULL; 

... 

的TCA应该看起来像下面这样:

'file' => array(
     'exclude' => 1, 
     'label' => 'LLL:EXT:<<extKey>>/Resources/Private/Language/locallang_db.xlf:tx_<<extKey>>_domain_model_downloaditem.file', 
     'config' => \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getFileFieldTCAConfig(
      'file', 
      array('maxitems' => 1, 
       'appearance' => array(
        'createNewRelationLinkTitle' => 'LLL:EXT:cms/locallang_ttc.xlf:media.addFileReference' 
       ), 
       'foreign_types' => array(
        '0' => array(
         'showitem' => ' 
         --palette--;LLL:EXT:lang/locallang_tca.xlf:sys_file_reference.imageoverlayPalette;imageoverlayPalette, 
         --palette--;;filePalette' 
        ), 
        \TYPO3\CMS\Core\Resource\File::FILETYPE_TEXT => array(
         'showitem' => ' 
         --palette--;LLL:EXT:lang/locallang_tca.xlf:sys_file_reference.imageoverlayPalette;imageoverlayPalette, 
         --palette--;;filePalette' 
        ), 
        \TYPO3\CMS\Core\Resource\File::FILETYPE_IMAGE => array(
         'showitem' => ' 
         --palette--;LLL:EXT:lang/locallang_tca.xlf:sys_file_reference.imageoverlayPalette;imageoverlayPalette, 
         --palette--;;filePalette' 
        ), 
        \TYPO3\CMS\Core\Resource\File::FILETYPE_AUDIO => array(
         'showitem' => ' 
         --palette--;LLL:EXT:lang/locallang_tca.xlf:sys_file_reference.imageoverlayPalette;imageoverlayPalette, 
         --palette--;;filePalette' 
        ), 
        \TYPO3\CMS\Core\Resource\File::FILETYPE_VIDEO => array(
         'showitem' => ' 
         --palette--;LLL:EXT:lang/locallang_tca.xlf:sys_file_reference.imageoverlayPalette;imageoverlayPalette, 
         --palette--;;filePalette' 
        ), 
        \TYPO3\CMS\Core\Resource\File::FILETYPE_APPLICATION => array(
         'showitem' => ' 
         --palette--;LLL:EXT:lang/locallang_tca.xlf:sys_file_reference.imageoverlayPalette;imageoverlayPalette, 
         --palette--;;filePalette' 
        ) 
       ), 
       'foreign_match_fields' => array(
        'tablenames' => 'tx_<<extKey>>_domain_model_downloaditem', 
       ), 
     ) 
    ), 
), 

注:您可以更改文件类型foreign_types,但重要的部分是:

'foreign_match_fields' => array(
       'tablenames' => 'tx_<<extKey>>_domain_model_downloaditem', 
      ), 

的表名必须是你的模型表的名称。

注:

  1. 现在你已经保存在默认文件夹中的文件。 如果您想要其他文件夹,请将参数$ storage-> getDefaultFolder()更改为您自己的文件夹。
  2. 如果你想创建一个在前端使用的文件下载链接:在标签
+1

不知道是谁删除我以前的评论的href {} downloadItem.file.originalResource.publicUrl,但再来一次。这个答案仍然不是100%正确的。 *在他自己的FileReference中删除方法调用的原因,如getValue(false)*该方法从未在FileReference对象中调用,但在UploadViewHelper中调用。对于TYPO3 7.6及更高版本,它自己的FileReference对象确实可以省略,但另一方面也不会造成危害。 – helhum 2016-12-07 16:35:40

+1

除此之外,创建upload_example的重点在于教人们分离关注点,并且不**在控制器中执行属性映射(处理文件上载),而是使用属性映射基础结构(请参阅链接博客文章在接受的答案)。 – helhum 2016-12-07 16:36:22

+0

我在代码中做了一些修改。在测试之前,请不要低估我的例子。我已经在您的存储库中写了一个问题,但您至今尚未回答。你的例子目前dosn't没有与错字8.x多数民众赞成多数民众赞成我点写这个例子 – 2016-12-07 16:49:33