如何重命名我用sonata-bundle下载的文件?
文件为PDF,数据库文件夹中的名称为:/upload/media/default/0001/01/0000000013ac6bf9000000017c7d6398.pdf
我希望我的文件显示如下:/upload/media/0001/01/myfile.pdf
答案 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()
中的文件名,它会使用sha1
等sha1($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);
}