如何使用奏鸣曲包重命名文件上传
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);
}
如何重命名我用 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);
}