如何重命名我用奏鸣曲捆绑下载的文件?
该文件是 PDF,数据库文件夹中的名称是:/upload/media/default/0001/01/0000000013ac6bf9000000017c7d6398.pdf
我希望我的文件如下所示:/upload/media/0001/01/myfile.pdf
谢谢你 !!
如何重命名我用奏鸣曲捆绑下载的文件?
该文件是 PDF,数据库文件夹中的名称是:/upload/media/default/0001/01/0000000013ac6bf9000000017c7d6398.pdf
我希望我的文件如下所示:/upload/media/0001/01/myfile.pdf
谢谢你 !!
如果您不希望在奏鸣曲上传期间重命名文件(仅类型文件)并保留其原始名称,那么您必须覆盖奏鸣曲的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()
要在下载之前更改文件(仅限文件类型)名称,您可以按照我之前的回答覆盖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);
}