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

时间:2015-07-31 12:44:08

标签: php symfony sonata-admin sonata-user-bundle sonata-media-bundle

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

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

谢谢!!

2 个答案:

答案 0 :(得分:2)

如果你不想通过奏鸣曲在上传过程中重命名文件(仅限类型文件)并保留其原始名称,那么你必须覆盖奏鸣曲的FileProvider类,当您通过生成Sonata's Media Bundle捆绑包来安装easy extend以获得子捆绑时,它会在src\Application生成扩展捆绑包,但是您可以自由选择自己的位置src\Application\Sonata\MediaBundle中的扩展束您可以通过在配置文件(yml,xml等)中定义来覆盖FileProvider的类参数(sonata.media.provider.file.class

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

现在使用奏鸣曲FileProvider扩展您的FileProvider课程,以便其他功能可以正常使用

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();*/
    }

}

在上面的类声纳中,通过在此函数中调用providerReference来设置generateReferenceName()中的文件名,它会使用sha1sha1($media->getName().uniqid().rand(11111, 99999))$media->getName()生成每个文件的唯一名称。上传文件的原始名称只返回此函数中的onHandleIntent(),您上传的文件将具有相同的名称

答案 1 :(得分:0)

要在下载之前更改文件(仅文件类型)名称,您可以按照我之前的答案覆盖FileProvider类,然后在您的类中覆盖基本文件提供程序的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);
}