さて、私は物事を機能させましたが、これが最も賢い方法であるかどうかはわかりません. でもまあ、それは道のりの一歩です。
このソリューションでは、認証されているかどうかにかかわらず、誰でも 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 アクセスの問題を修正するために出発します...