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

そして、この URL が誰にでも公開されるという欠点があることを覚えておいてください。そのため、必要なリソースが見つかるまで、誰でも URL を推測できます。

誰かがこれを役に立てば幸いです。今、私はその 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 に答える