4

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

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

get 方法可用于检索给定文件的内容。该方法将返回文件的原始字符串内容:

$contents = Storage::get('file.jpg');

果然,当我的 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]�մ���ԕqJ� X�?��ቿ3��>��甽�_4o�^ s�Ӻ|�#�����H9 " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "

只是更长,更长。这没什么用。如何将其转换为原始图像?当我上传/显示视频时,过程是否相同?

4

2 回答 2

2

好的,所以我让事情顺利进行,但我不确定这是否是最聪明的方法。但是,嘿,这是一个步骤。

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

有用的资源

flysystem原始文档

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

Laravel 文档

  • 对于开始使用 flysystem 的 laravel 实现很有用。

适用于 PHP 的 AWS SDK 指南

  • 如果您想编写自定义 s3 代码,这是很好的参考。

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

1.将您的 s3 凭据添加到config/filesystems.php. 我还使用 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

请注意,密钥是您的 s3 对象名称,而不是您的 aws 访问密钥或密钥。此外,如果您没有将可见性设置为“公共”(默认为私有),则此解决方案将不起作用,例如您无法显示文件。

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 对象的公共 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

请记住,缺陷是这个网址对任何人都是公开的。所以任何人都可以去猜测网址,直到找到他们想要的资源。

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

于 2015-06-20T11:31:43.050 回答
0

尝试编码base64并显示img

 $file = Storage::get($filePath);

// 读取图片路径,转base64编码

$imgData = base64_encode($file);

// 格式化图片 SRC: data:{mime};base64,{data};

$src = 'data: '.mime_content_type($img_file).';base64,'.$imgData;

// 回显一个示例图像

echo '<img src="'.$src.'">';
于 2015-06-19T14:48:04.923 回答