如何使用奏鸣曲包重命名文件上传

how to rename file upload with sonata bundle

如何重命名我用 sonata-bundle 下载的文件?

文件为 PDF,数据库文件夹中的名称为:/upload/media/default/0001/01/0000000013ac6bf9000000017c7d6398.pdf 我希望我的文件显示如下:/upload/media/0001/01/myfile.pdf

谢谢!!

如果您不希望文件(仅限类型文件)在奏鸣曲上传期间重命名并保留其原始名称,那么您必须覆盖奏鸣曲的 FileProvider class ,当您默认安装 Sonata's Media Bundle its good to have a child bundle by generating its easy extend 捆绑包,它会在 src\Application 中生成扩展捆绑包,但您可以自由选择自己的位置,一旦您拥有 src\Application\Sonata\MediaBundle 中的扩展捆绑包,您就可以覆盖 FileProvider的class参数(sonata.media.provider.file.class)通过在你的配置文件中定义(yml,xml等)

parameters:
    sonata.media.provider.file.class: Application\Sonata\MediaBundle\Provider\FileProvider

现在用奏鸣曲的 FileProvider 扩展您的 FileProvider class,以便其他功能可以正常工作

namespace Application\Sonata\MediaBundle\Provider;
//... other uses classes
use Sonata\MediaBundle\Provider\FileProvider as BaseProvider ;
class FileProvider extends BaseProvider
{

    public function __construct($name, Filesystem $filesystem, CDNInterface $cdn, GeneratorInterface $pathGenerator, ThumbnailInterface $thumbnail, array $allowedExtensions = array(), array $allowedMimeTypes = array(), MetadataBuilderInterface $metadata = null)
    {
        parent::__construct($name, $filesystem, $cdn, $pathGenerator, $thumbnail);

        $this->allowedExtensions = $allowedExtensions;
        $this->allowedMimeTypes  = $allowedMimeTypes;
        $this->metadata = $metadata;
    }

    protected function generateReferenceName(MediaInterface $media)
    {
        return $media->getName();
        /** return $this->generateMediaUniqId($media).'.'.$media->getBinaryContent()->guessExtension();*/
    }

}

在上面的 class 奏鸣曲中通过调用 generateReferenceName()providerReference 中设置文件名,在此函数中它使用 sha1 为每个文件生成一个唯一的名称,例如 sha1($media->getName().uniqid().rand(11111, 99999)) 所以要在这个函数中为上传的文件取一个原始名称 return $media->getName() 并且你上传的文件将具有相同的名称

要在下载前更改文件(仅限文件类型)名称,您可以按照我之前的回答覆盖 FileProvider class,然后在您的 class 覆盖基础文件提供商的 getDownloadResponse()函数并为下载文件定义您想要的名称

public function getDownloadResponse(MediaInterface $media, $format, $mode, array $headers = array())
{

    $guesser = ExtensionGuesser::getInstance();
    $extension = $guesser->guess($media->getContentType());
    // build the default headers
    $headers = array_merge(array(
        'Content-Type'          => $media->getContentType(),
        'Content-Disposition'   => sprintf('attachment; filename="%s"', 'myfile.'.$extension),
    ), $headers);

    if (!in_array($mode, array('http', 'X-Sendfile', 'X-Accel-Redirect'))) {
        throw new \RuntimeException('Invalid mode provided');
    }

    if ($mode == 'http') {
        if ($format == 'reference') {
            $file = $this->getReferenceFile($media);
        } else {
            $file = $this->getFilesystem()->get($this->generatePrivateUrl($media, $format));
        }

        return new StreamedResponse(function() use ($file) {
            echo $file->getContent();
        }, 200, $headers);
    }

    if (!$this->getFilesystem()->getAdapter() instanceof \Sonata\MediaBundle\Filesystem\Local) {
        throw new \RuntimeException('Cannot use X-Sendfile or X-Accel-Redirect with non \Sonata\MediaBundle\Filesystem\Local');
    }

    $filename = sprintf('%s/%s',
        $this->getFilesystem()->getAdapter()->getDirectory(),
        $this->generatePrivateUrl($media, $format)
    );

    return new BinaryFileResponse($filename, 200, $headers);
}