3

私は SonataMediaBundle を使用しており、今までwebSymfony のフォルダーにファイルを公開してアップロードしていました。ここに私の設定ファイルの一部があります:

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/***

これらのファイルは public フォルダーにあるため、誰でも見ることができます。このフォルダを のどこかで変更できることはわかっていますapp/Resources/が、そうするとすべてのファイルが非公開になってしまい、望ましくありません。プライベートとは、どういうわけか、コントローラーによって提供される必要があることを意味します。

一部のファイルを公開し、他のファイルを非公開にするにはどうすればよいですか? 特定のコンテキストでファイルを別のコンテキストとは異なる方法でアップロードする方法はありますか? それとも他の方法ですか?

また、ファイルを app/Resources フォルダーにアップロードすると、URL がhttp://website.com/app/Resources/media/profile_pics/0001/01/85e05ab9685b1745af4e64ff98ef91eed6e4ccdf.jpegになるためプレビューできません。 Symfony が持っている唯一の公開ファイルである web フォルダーにはありません。これはどのように行うことができますか?

編集:アップロードの部分はなんとかできましたが(以下の回答を確認してください)、取得の部分は少し面倒です。私はまだそれを行う方法を探しています。

4

2 に答える 2

3

よし、もうすぐだ。ファイルは任意のフォルダにアップロードされていますが、ファイルが表示されないという問題があります。

アイデアは、独自のファイル システムとアダプター サービスを持つカスタム プロバイダーを作成することです。問題は、ファイルをアップロードするフォルダーをアダプター サービスに渡す必要があることでした。そのアダプターはファイルシステムに渡され、その後プロバイダーに渡されます。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();

$file は、フォームから取得したファイル コンテンツです。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]

プロバイダー用のカスタム ファイル システムやアダプターを作成する必要はありません。新しいサービスを作成してディレクトリをアダプターに渡し、アダプターをファイル システムに、ファイル システムをカスタム プロバイダーに渡すだけです。これは、カスタム機能が必要ない場合です。

于 2015-11-18T18:09:36.873 に答える