我很茫然。我正在尝试显示一个对象(image.jpg)我已成功上传到我的s3存储桶。
我已确保将该文件设置为公开。我使用Storage :: get();方法which the doc says“返回对象的字符串”。见这里:
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Ï[4Uԅ8uwXBr=F8ԟȰTT ]●:K〜сVVAlv7cOV7b`sMD,6]մԕqJ ?Xቿ3>甽_4o ^sӺ|#H9 “”“”“”“”“”“”“”“”“”“”“”“”“” “”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”
更长,更长。这没用。如何将其转换为原始图像?当我上传/显示视频时,过程是否相同?
答案 0 :(得分:2)
好的,所以我让事情有效,但我不确定这是否是最明智的方式。但是,嘿,这是一步之遥。
请注意,此解决方案允许任何经过身份验证或未经过身份验证的人访问您的s3对象网址。我还没弄明白如何控制访问。
有用资源
The flysystem original documentation
有了这个,我就是这样创造的。显示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 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网址:https://s3.eu-central-1.amazonaws.com/bucketname/resource-22
请记住,这个漏洞是这个网址对任何人都是公开的。所以任何人都可以去猜测网址,直到找到他们想要的资源。
我希望有人觉得这很有帮助。现在我将关闭修复d * mn url访问问题...
答案 1 :(得分: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.'">';