2013-06-03 2 views
1

오디오 파일을 저장하기 위해 SonataMediaBundle을 사용해야합니다. mp3를 사용하고 어쨌든 그 파일도 ogg에 저장하십시오.Symfony2 SonataMediaBundle 오디오 구성

그래서 기본적으로 설정이 필요합니다. 현재

나는이 있습니다

sonata_media: 
default_context: default 
db_driver: doctrine_orm # or doctrine_mongodb, doctrine_phpcr 
contexts: 
    default: # the default context is mandatory 
     providers: 
      - sonata.media.provider.dailymotion 
      - sonata.media.provider.youtube 
      - sonata.media.provider.image 
      - sonata.media.provider.file 

     formats: 
      small: { width: 100 , quality: 70} 
      big: { width: 500 , quality: 70} 
    user: 
     providers: 
      - sonata.media.provider.file 
     formats: 
      mp3: { quality: 100} 
      ogg: { quality: 100} 

cdn: 
    server: 
     path: /uploads/media # http://media.sonata-project.org/ 

filesystem: 
    local: 
     directory: %kernel.root_dir%/uploads/media 
     create:  true 
class: 
    media: Application\Sonata\MediaBundle\Entity\Media 

을하지만 임 때 명령을 사용하여 :

php.exe와의 C를 : \ XAMPP \ htdocs를 \ Radiooo \ 응용 프로그램 \ 콘솔 소나타 : 미디어 : sonata.media 추가 .provider.file 사용자 C : /test.mp3

임지고 파일은 임 잘못하고 무엇을 도와 줄 수 45914671541816acb68412cc66ba1a71da3ac7a1.mpga

같은 저장?

+0

이 문제에 대한 해결책을 찾은 적이 있습니까? –

+0

아직 없습니다. 나는이 Sonata Managers, Providers 및 Generators를 바탕으로 저의 추격전을 쓰도록 결정했습니다 ... – nvvetal

답변

2

우선,이 질문의 작성 날짜를 완전히 알고 있지만, 최근 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; 
    } 
} 

을 나는 그것으로 아무 문제가 없었다 :)

관련 문제