簡體   English   中英

使用OneUpUploaderBundle在Symfony v4.1中將文件名從UploadNamer傳遞到UploadListener

[英]Passing file name from UploadNamer to UploadListener in Symfony v4.1 with OneUpUploaderBundle

介紹

我正在將Symfony v4.1.*OneUpUploaderBundle一起使用 我需要為每個上傳的文件設置唯一的名稱-可以。

我有tree structure ,其中包含上載的文件。 為了管理樹中的文件,我有多個屬性。 他們之中有一些是:

  1. itemName (音譯文件名+計數器+ unique_sting)
  2. itemOriginalName (音譯文件名+計數器)
  3. itemExtension (文件擴展名-例如.txt.a如果是目錄))
  4. itemSortValue (文件擴展名+音譯文件名+計數器+ unique_sting)

ItemSortValue確保樹枝(字段)按字母順序排序。

問題

我還需要將有關上傳文件的信息保留在數據庫中。 為此,我需要在onPostUpload事件的UploadListeneronPostUploadUploadNamer管理的每個complete file name

path/to/file/my_file_name(counter)_{time}_{uniqueString}.extension

我需要將相同的唯一文件名保存到數據庫。 但是,我面臨的問題是-我不知道,也找不到如何將信息從UploadNamer傳遞給uploadListener

我嘗試使用$this->originalName ,但未產生積極結果。

如何使用OneUpUploaderBundleSymfony v4.1 OneUpUploaderBundle值從UploadNamerUploadListener (onPostUpload事件)

碼:

自定義名稱

public function name(FileInterface $file)
{
    $upload_file_path = $this->ultraHelpers->getUploadableFilePath();

    $unique_string = $this->ultraHelpers->getUniqueString(true);

    $file_name = $file->getClientOriginalName();
    $file_info = $this->ultraHelpers->filterFileInfoFromFilename($file_name);

    return sprintf('%s/%s_%s.%s',
        $upload_file_path,
        $this->ultraText->transliterateText($file_info['name']),
        $unique_string,
        $file_info['extension']
    );
}

UploadNamer示例輸出

dir1/dir2/dir3/my_file_name_1539617029_23bf16f962c658103f10ece7d3ba7a88.txt

that corresponds to
path/to/file/my_file_name(counter)_{time}_{uniqueString}.extension

我的UploadListener

<?php

namespace App\EventListener;

use App\UltraHelpers\UltraFileTree;
use App\UltraHelpers\UltraHelpers;
use App\UltraHelpers\UltraText;
use DateTime;
use App\Entity\FileTree;
use Doctrine\ORM\EntityManagerInterface;
use Oneup\UploaderBundle\Event\PreUploadEvent;
use Oneup\UploaderBundle\Event\PostUploadEvent;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Session\SessionInterface;

class UploadListener
{
    /**
     * @var EntityManagerInterface
     */
    protected $entityManager;

    /**
     * @var SessionInterface
     */
    protected $session;

    /**
     * @var ContainerInterface
     */
    protected $container;

    /**
     * @var UltraHelpers
     */
    protected $ultraHelpers;

    /**
     * @var UltraText
     */
    protected $ultraText;

    /**
     * @var UltraFileTree
     */
    protected $ultraFileTree;

    protected $originalName;

    public function __construct(EntityManagerInterface $entityManager, SessionInterface $session, ContainerInterface $container, UltraHelpers $ultraHelpers, UltraText $ultraText, UltraFileTree $ultraFileTree)
    {
        $this->entityManager = $entityManager;
        $this->session = $session;
        $this->container = $container;
        $this->ultraHelpers = $ultraHelpers;
        $this->ultraText = $ultraText;
        $this->ultraFileTree = $ultraFileTree;
        $this->originalName = [];
    }

    public function onUpload(PreUploadEvent $event)
    {
        $file = $event->getFile();

        $file_info = $this->ultraHelpers->filterFileInfoFromPath($file->getClientOriginalName());
        $this->originalName = $this->ultraText->transliterateText($file_info['name']);

        $response = $event->getResponse();
        $message = [
            'error' => 'none'
        ];
        $response->addToOffset($message, array('files'));
    }

    public function onPostUpload(PostUploadEvent $event)
    {
        $now_date_time = date('Y-m-d H:i:s');

        $repo_file_tree = $this->entityManager->getRepository('App:FileTree');
        $repo_project = $this->entityManager->getRepository('App:Project');
        $repo_whereabouts = $this->entityManager->getRepository('App:Whereabouts');

        $whereabouts = $this->session->get('whereabouts');
        $my_whereabouts = $repo_whereabouts->getWhereabouts($whereabouts);

        // get project object
        $project_obj = $repo_project->findOneBy(array('id' => $my_whereabouts['project_id']));
        // get current directory object
        $node_selected_obj = $repo_file_tree->findOneBy(array('id' => $my_whereabouts['node_selected_id']));

        $file = $event->getFile();
        $file_size = $file->getSize();

        $current_file_name_parts = $this->ultraHelpers->getFileNameParts($this->originalName);
        $postfix_txt = $this->ultraHelpers->getFileNamePostfixTxt($current_file_name_parts['name'], $my_whereabouts['node_selected_id']);

        $file_tree = new FileTree();
        $file_tree->setItemOriginalName($current_file_name_parts['name'] . $postfix_txt);
        $file_tree->setItemName($current_file_name_parts['name'] . $postfix_txt);
        $file_tree->setItemExtension('.'. $current_file_name_parts['extension']);
        $file_tree->setItemSortValue('.'. $current_file_name_parts['extension'] .'.'. $current_file_name_parts['name'] . $postfix_txt);
        $file_tree->setItemSize($file_size);
        $file_tree->setUpdatedAt(new DateTime($now_date_time));
        $file_tree->setIsFile(true);
        $file_tree->setParent($node_selected_obj);
        $file_tree->setProject($project_obj);

        $this->entityManager->persist($file_tree);
        $this->entityManager->flush();
        $this->entityManager->clear();

        // pārkārto FileTree koka zaru ievērojot jaunpievienoto failu
        $file_tree_branch_node_id = $repo_file_tree->getOneFileTreeNode($my_whereabouts['node_selected_id']);
        $this->ultraFileTree->reorderFileTreeBranch($file_tree_branch_node_id);

        $event->getResponse();
    }
}

結論

請指教。

感謝您的時間和知識。

更新1

在GitHub的OneupUploaderBundle中添加了github問題 (#348)

可以使用$file->getPathname中的$file->getPathnameeventListener獲取文件名。

我在隨后的代碼塊中出現了偷偷摸摸的錯誤,因此它使我相信文件名存在問題...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM