2015-11-17 53 views
1

我使用SonataMediaBundle,直到現在我已經在Symfony的web文件夾中公開上傳文件。下面是我的配置文件的一部分:SonataMediaBundle的公共和私人媒體上傳到不同的文件夾(網頁和私人)

contexts: 
    default: # the default context is mandatory 
     providers: 
      - sonata.media.provider.dailymotion 
      - sonata.media.provider.youtube 
      - sonata.media.provider.image 
      - sonata.media.provider.file 
      - sonata.media.provider.vimeo 

     formats: 
      small: { width: 100 , quality: 70} 
      big: { width: 500 , quality: 70} 
    profile_pics: # the default context is mandatory 
     providers: 
      - sonata.media.provider.dailymotion 
      - sonata.media.provider.youtube 
      - sonata.media.provider.image 
      - sonata.media.provider.file 
      - sonata.media.provider.vimeo 

     formats: 
      small: { width: 100 , quality: 70} 
      big: { width: 500 , quality: 70} 

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

filesystem: 
    local: 
     directory: %kernel.root_dir%/../web/uploads/media 
     create:  false 

在我parameters.yml我有cdn_server_path: /uploads/media/

這將上傳web/uploads/media/contextname/0001/01/***中的文件。

在公用文件夾中,這些文件對每個人都是可見的。我知道我可以在app/Resources/以上某個地方更改此文件夾,但這會使我的所有文件變爲私人,這是我不想要的。私下來說,我的意思是他們應該由管理員以某種方式爲其服務。

我該如何區分一些公開的文件和其他私人文件?有沒有辦法讓某個上下文上傳文件的方式與另一個不同?或者其他方式?

此外,上傳文件到應用程序/資源文件夾時,它們無法預覽,因爲它們的url變成http://website.com/app/Resources/media/profile_pics/0001/01/85e05ab9685b1745af4e64ff98ef91eed6e4ccdf.jpeg,因爲它不在Web文件夾中,這是Symfony唯一的公共文件。如何才能做到這一點?

編輯:我設法做了上傳部分(檢查下面的答案),但檢索部分有點麻煩。我仍在尋找一種方法來做到這一點。

回答

0

好吧我快到了。我的文件正在上傳到我想要的任何文件夾中,但我遇到了讓它們顯示的問題。

這個想法是創建一個具有自己的文件系統和適配器服務的自定義提供程序。問題是我需要將適配器服務傳遞到我想要上傳文件的文件夾中。該適配器被傳遞給文件系統,然後傳遞給提供者。 SonataMediaBundle的問題在於它不允許您修改適配器的目錄,因此您必須創建自己的目錄並將其傳遞給提供者。

服務:

sonata.media.provider.private: 
    class: MedAppBundle\Services\PrivateFilesProvider 
    tags: 
     - { name: sonata.media.provider } 
    arguments: [%private_provider_name%,@medapp_private.filesystem,@sonata.media.cdn.server,@sonata.media.generator.default,@sonata.media.thumbnail.format] 
medapp_private.filesystem: 
    class: MedAppBundle\Services\PrivateFilesystem 
    arguments: [@medapp_private.adapter] 
medapp_private.adapter: 
    class: MedAppBundle\Services\PrivateFileAdapter 
    arguments: [%private_filesystem_directory%,true] 

parameters.yml

private_filesystem_directory: %kernel.root_dir%/Resources/media 
private_provider_name: sonata.media.provider.private 

定製適配器

use Sonata\MediaBundle\Filesystem\Local; 

class PrivateFileAdapter extends Local 
{ 

} 

文件系統

use Gaufrette\Filesystem; 

class PrivateFilesystem extends Filesystem 
{ 

} 

最後,供應商

use Application\Sonata\MediaBundle\Entity\Media; 
use Gaufrette\Filesystem; 
use Sonata\MediaBundle\CDN\CDNInterface; 
use Sonata\MediaBundle\Generator\GeneratorInterface; 
use Sonata\MediaBundle\Provider\FileProvider; 

use Sonata\MediaBundle\Thumbnail\ThumbnailInterface; 

class PrivateFilesProvider extends FileProvider 
{ 

    public function getPrivateMedia(Media $media) 
    { 
     // $path = $this->generatePublicUrl($media, 'reference'); 
     // $ppath = $this->generatePrivateUrl($media, "reference"); 
     $content = $this->getReferenceFile($media)->getContent(); 
     header('Content-Type: ' . $media->getContentType()); 


     return 'data:' . $media->getContentType() . ';base64,' . base64_encode($content); 

    } 
} 

然後,此提供程序添加到您的任何sonata_media上下文。我已經將其添加到默認的情況下,例如:

sonata_media: 
    db_driver: doctrine_orm 
    default_context: default 
    contexts: 
     default: 
      providers: 
       - sonata.media.provider.dailymotion 
       - sonata.media.provider.youtube 
       - sonata.media.provider.image 
       - sonata.media.provider.file 
       - sonata.media.provider.vimeo 
       - sonata.media.provider.private 

要在私人文件夾中創建一個新媒體:

$media = new Media();   
$media->setBinaryContent($file); 
$media->setContext('default'); 
$media->setProviderName('sonata.media.provider.private'); 
$this->em->persist($media); 
$this->em->flush(); 

$文件是從你的表單提供的文件內容。 這將創建文件將被上傳的文件夾app\Resources\media\default\0001\01

現在問題是檢索它們,因爲它們沒有公共鏈接,需要在控制器中檢索。我在提供程序中創建了getPrivateMedia()方法,但它不能按預期工作。

編輯: 注意到,這些服務也像這樣定義:

sonata.media.provider.private: 
    class: MedAppBundle\Services\PrivateFilesProvider 
    tags: 
     - { name: sonata.media.provider } 
    arguments: [%private_provider_name%,@medapp_private.filesystem,@sonata.media.cdn.server,@sonata.media.generator.default,@sonata.media.thumbnail.format,%kernel.root_dir%] 

medapp_private.filesystem: 
    class: Gaufrette\Filesystem 
    arguments: [@medapp_private.adapter] 

medapp_private.adapter: 
    class: Sonata\MediaBundle\Filesystem\Local 
    arguments: [%private_filesystem_directory%,true] 

沒有必要創建一個自定義的文件系統或適配器的供應商,只需要創建新的服務,並通過目錄到適配器,然後將適配器傳遞到文件系統並將文件系統傳遞到自定義提供程序。這是如果你不需要任何自定義功能。