使用 laravel 5.1 文件系统时如何将 s3 对象字符串变成有用的东西
How to turn an s3 object string into something useful when using laravel 5.1 filesystem
我很茫然。我正在尝试显示已成功上传到我的 s3 存储桶的对象 (image.jpg)。
我已确定文件设置为 public。我使用 Storage::get();方法 which the doc says "returns a string of the object"。看这里:
The get method may be used to retrieve the contents of a given file.
The raw string contents of the file will be returned by the method:
$contents = Storage::get('file.jpg');
果然,当我的显示方法如下所示时:
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]մ����udqJ�
X��?����ቿ3��>��锽��_4o�^s�Ӻ|��#����H9
“”“”“”“”“”“”“”“”“”“”“”“”“”“”
"""""""""""""""""""""""""""""""
只是长得多,长得多。这没有用。我如何将其转换为原始图像?我 upload/show 视频的过程是一样的吗?
尝试编码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.'">';
好的,所以我让事情成功了,但我不确定这是否是最聪明的方法。但是,嘿,这是前进的一步。
请注意,此解决方案允许任何人(无论是否经过身份验证)访问您的 s3 对象 url。我还没有想出如何控制访问。
有用的资源
The flysystem original documentation
- 有关 flysystem 包的详细信息,并描述了 laravel 文档中未涵盖的方法,例如 getMimetype。
- 对于 flysystem 的 laravel 实现入门很有用。
- 如果您想编写自定义 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
请注意,这里的密钥是您的 s3 对象名称,而不是您的 aws 访问密钥或秘密密钥。此外,如果您未将可见性设置为 'public'(默认为私有),则此解决方案将不起作用,例如您无法显示该文件。
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
结果
上图获取s3url:https://s3.eu-central-1.amazonaws.com/bucketname/resource-22
记住,缺点是 url 对任何人来说都是 public。所以任何人都可以去猜测 urls 直到他们找到他们想要的资源。
我希望有人觉得这有帮助。现在我要去解决 d*mn url 访问问题...
我很茫然。我正在尝试显示已成功上传到我的 s3 存储桶的对象 (image.jpg)。
我已确定文件设置为 public。我使用 Storage::get();方法 which the doc says "returns a string of the object"。看这里:
The get method may be used to retrieve the contents of a given file. The raw string contents of the file will be returned by the method:
$contents = Storage::get('file.jpg');
果然,当我的显示方法如下所示时:
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]մ����udqJ� X��?����ቿ3��>��锽��_4o�^s�Ӻ|��#����H9 “”“”“”“”“”“”“”“”“”“”“”“”“”“” """""""""""""""""""""""""""""""
只是长得多,长得多。这没有用。我如何将其转换为原始图像?我 upload/show 视频的过程是一样的吗?
尝试编码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.'">';
好的,所以我让事情成功了,但我不确定这是否是最聪明的方法。但是,嘿,这是前进的一步。
请注意,此解决方案允许任何人(无论是否经过身份验证)访问您的 s3 对象 url。我还没有想出如何控制访问。
有用的资源
The flysystem original documentation
- 有关 flysystem 包的详细信息,并描述了 laravel 文档中未涵盖的方法,例如 getMimetype。
- 对于 flysystem 的 laravel 实现入门很有用。
- 如果您想编写自定义 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
请注意,这里的密钥是您的 s3 对象名称,而不是您的 aws 访问密钥或秘密密钥。此外,如果您未将可见性设置为 'public'(默认为私有),则此解决方案将不起作用,例如您无法显示该文件。
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
结果
上图获取s3url:https://s3.eu-central-1.amazonaws.com/bucketname/resource-22
记住,缺点是 url 对任何人来说都是 public。所以任何人都可以去猜测 urls 直到他们找到他们想要的资源。
我希望有人觉得这有帮助。现在我要去解决 d*mn url 访问问题...