우선,이 질문의 작성 날짜를 완전히 알고 있지만, 최근 mp3 파일을 업로드하고 파일 확장명을 mp3로 바꾸는 대신에 같은 문제가 발생했습니다. mpga. 그리고 내가 볼 수있는 한, 지난 3 년 동안 소스 코드에 추가 된 쉬운 솔루션이 없었습니다 ...
저는 제 해결책이 최선이 아니라고 확신하지만,
// FileProvider.php#L483
$guesser = ExtensionGuesser::getInstance();
$extension = $guesser->guess($media->getContentType());
: 적은 양의 코드 추가 :
을 내 프로젝트에서, 나는 정확히이 라인에 문제를 초래 심포니 Request
클래스에 Media
개체의 BinaryContent
을 설정하여 파일을 업로드했다
FileProvider
클래스는 ExtensionGuesser
의 인스턴스를 가져옵니다. 심포니에서 그 주어진 ContentType을위한 확장해야 무엇을 추측하는 작업을 수행 할 수 있습니다 : 우리는 자신의 MimeType->Extension
매핑을 추가하거나 단순히의 클래스를 대체 할 수있는 하나 있다면 그것이 좋은 것
// MimeTypeExtensionGuesser.php#L623
'audio/mpeg' => 'mpga',
를 내 의견을 ExtensionGuesser는 구성 파일을 약간 변경했습니다. 그러나 우리 같은 세 사람이 mp3 파일을 업로드하고 mpga로 전환하는 것을 원하지 않는다는 것을 아무도 몰랐습니다 ... 그래서 이런 해결책이 없었습니다.
그러나 우리는 실제로 FileProvider
의 클래스를 변경하고 단지 우리가 다른 것을하고 싶은 방법을 덮어 쓸 수 있습니다 : 꽤 잘 지금 작동까지
// app/config/services.yml
parameters:
sonata.media.provider.file.class: Application\Sonata\MediaBundle\Provider\FileProvider
// Application\Sonata\MediaBundle\Provider\FileProvider:
<?php
namespace Application\Sonata\MediaBundle\Provider;
use Sonata\MediaBundle\Extra\ApiMediaFile;
use Sonata\MediaBundle\Model\MediaInterface;
use Symfony\Component\HttpFoundation\File\MimeType\ExtensionGuesser;
use Symfony\Component\HttpFoundation\Request;
/**
* Class FileProvider
*
* @package Application\Sonata\MediaBundle\Provider
*/
class FileProvider extends \Sonata\MediaBundle\Provider\FileProvider
{
/**
* @var array
*/
protected $contentTypeMapping = [
'audio/mpeg' => 'mp3'
];
/**
* Set media binary content according to request content.
*
* @param MediaInterface $media
*/
protected function generateBinaryFromRequest(MediaInterface $media)
{
if (php_sapi_name() === 'cli') {
throw new \RuntimeException('The current process cannot be executed in cli environment');
}
if (!$media->getContentType()) {
throw new \RuntimeException(
'You must provide the content type value for your media before setting the binary content'
);
}
$request = $media->getBinaryContent();
if (!$request instanceof Request) {
throw new \RuntimeException('Expected Request in binary content');
}
$content = $request->getContent();
$extension = $this->getExtension($media->getContentType());
$handle = tmpfile();
fwrite($handle, $content);
$file = new ApiMediaFile($handle);
$file->setExtension($extension);
$file->setMimetype($media->getContentType());
$media->setBinaryContent($file);
}
/**
* Returns the fileExtension for a given contentType
*
* First of all, we have to look at our own mapping and if we have no mapping defined, just use the ExtensionGuesser
*
* @param string $contentType
*
* @return string
*/
private function getExtension($contentType)
{
if (array_key_exists($contentType, $this->contentTypeMapping)) {
return $this->contentTypeMapping[$contentType];
}
// create unique id for media reference
$guesser = ExtensionGuesser::getInstance();
$extension = $guesser->guess($contentType);
if (!$extension) {
throw new \RuntimeException(
sprintf('Unable to guess extension for content type %s', $contentType)
);
}
return $extension;
}
}
을 나는 그것으로 아무 문제가 없었다 :)
이 문제에 대한 해결책을 찾은 적이 있습니까? –
아직 없습니다. 나는이 Sonata Managers, Providers 및 Generators를 바탕으로 저의 추격전을 쓰도록 결정했습니다 ... – nvvetal