我不知所措。我正在尝试显示已成功上传到 s3 存储桶的对象 (image.jpg)。

我已确保该文件设置为公开。我使用 Storage::get(); which the doc says 方法“返回对象的字符串”。看这里:



果然,当我的 show 方法看起来像这样:

public function show($id)
{
    /* Get DB instance */
    $resource = Resource::findOrFail($id);

    /* Create s3 file path */
    $filePath = 'resource-'.$resource->id;

    /* Get object in s3 bucket */
    $file = Storage::get($filePath);

    return view('resource.show', compact('resource', 'file'));
}

当我执行 {!! $file !!} 时,它​​在我看来输出以下内容

���p�s0wr �4miq �V �Pr�;�-��##�� �EM����cA。
{����{��1�Whuf��|Ji�{�=3�P� 1�������3�1Y���W���N�/
�Hnt�Ï�[����� �4����Uԅ�8u�w���XB�r��=F8�ԟȰ�T��T
]���q��:�K~�с�VV�Alv�����7cOV�7�b�`s��� �M��D�Ɲ�6]�... �
X�?���ቿ3��>��甽�_4o�^ s�Ӻ |�#�����H9
"""""""""""""""""""""""""""
“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”

只是很多,更长的时间。这没有用。如何将其转换为原始图像?上传/显示视频时的过程是否相同?

最佳答案

好的,所以我让事情奏效了,但我不确定这是否是最聪明的方法。但是,嘿,这是前进的一步。

请注意,此解决方案允许任何人(无论是否通过身份验证)访问您的 s3 对象 url。我还没有弄清楚如何控制访问。

有用的资源

The flysystem original documentation

  • 有关 flysystem 包的详细信息,并描述了 laravel 文档中未涵盖的 getMimetype 等方法。

  • Laravel docs
  • 用于开始使用 flysystem 的 laravel 实现。

  • The AWS Sdk guide for PHP
  • 如果您想编写自定义 s3 代码,这是一个很好的引用。


  • 顺便说一句,这是我创建和显示 s3 对象的方法

    1. config/filesystems.php 中添加您的 s3 凭据。我还使用 s3 进行开发以确保一切正常。
    return [
    
        'default' => 's3',
    
        'cloud' => 's3',
    
        'disks' => [
    
            'local' => [
                'driver' => 'local',
                'root'   => storage_path().'/app',
            ],
    
            's3' => [
                'driver' => 's3',
                'key'    => env('AWS_ACCESS_KEY_ID'),
                'secret' => env('AWS_SECRET_ACCESS_KEY'),
                'region' => env('AWS_REGION'),
                'bucket' => env('AWS_BUCKET'),
            ],
    
            'rackspace' => [
                'driver'    => 'rackspace',
                'username'  => 'your-username',
                'key'       => 'your-key',
                'container' => 'your-container',
                'endpoint'  => 'https://identity.api.rackspacecloud.com/v2.0/',
                'region'    => 'IAD',
            ],
    
        ],
    
    ];
    

    2. 我的存储方法:ResourceController@store
    请注意,这里的 key 是您的 s3 对象名称,而不是您的 aws 访问 key 或 secret key 。此外,如果您未将可见性设置为“公共(public)”(默认为私有(private)),则此解决方案将不起作用,例如你不能显示文件。
    public function store(ResourceRequest $request)
    {
        /* Store entry in DB */
        $resource = new Resource();
        $resource->title = $request->title;
        $resource->save();
    
        /* Prepare data needed for storage */
        $key = 'resource-'.$resource->id;
        $file = file_get_contents($request->file('resource'));
        $visibility = 'public';
    
        /* Store file */
        Storage::put($key, $file, $visibility);
    
        /* Success message */
        session()->flash('message', $request->title . ' uploaded!');
        return redirect()->route('resource-index');
    }
    

    3. 我的展示方法:ResourceController@show
    在这里,我只是建立了 aws s3 对象公共(public) url,所以我可以在我的 <img><video> 标签中引用它
    public function show($id)
    {
        /* Get DB instance */
        $resource = Resource::findOrFail($id);
    
        /* Set bucket */
        $bucket = env('AWS_BUCKET');
    
        /* Set file key */
        $key = 'resource-'.$resource->id;
    
        /* Build & push s3 url into array */
        $file['url']= 'https://s3.eu-central-1.amazonaws.com/'.$bucket.'/'.$key;
    
        /* Get & push mime type into array. */
        $file['type'] = Storage::getMimetype($key);
    
        return view('resource.show', compact('resource', 'file'));
    }
    

    4. 最后,我的看法。在这里,我检查 mime 类型以确保正确的文件类型获得正确的标签。
    @extends('layout.base')
    
    @section('title') Show Resource @stop
    
    @section('content')
    
        <h1>Show Resource</h1>
    
        @include('layout.partials.message')
    
        <h2>{{ $resource->title }}</h2>
    
        @if ($file['type'] == 'image/jpeg')
            <img src="{!! $file['url'] !!}" alt="">
        @else
            <video src="{!! $file['url'] !!}" controls></video>
        @endif
    
    @stop
    

    结果

    上图获取s3 url:https://s3.eu-central-1.amazonaws.com/bucketname/resource-22
    请记住,缺陷是此 url 对任何人都是公开的。所以任何人都可以去猜测网址,直到找到他们想要的资源。

    我希望有人觉得这有帮助。现在我要去解决那个 d*mn url 访问问题...

    关于php - 使用 laravel 5.1 文件系统时如何将 s3 对象字符串转换为有用的东西,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30922716/

    10-16 15:18