gpt4 book ai didi

php - 使用 laravel 5.1 文件系统时如何将 s3 对象字符串变成有用的东西

转载 作者:可可西里 更新时间:2023-10-31 23:29:59 25 4
gpt4 key购买 nike

我很迷茫。我正在尝试显示已成功上传到我的 s3 存储桶的对象 (image.jpg)。

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

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');

果然,当我的 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'));
}

当我执行 {!! 时,它在我的 View 中输出以下内容$文件!!}

����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“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“”””””””””””””””””””””””””””””

只是非常非常长。这没有用。我如何将其转换为原始图像?我上传/显示视频时的过程是否相同?

最佳答案

好的,所以我让事情成功了,但我不确定这是否是最聪明的方法。但是,嘿,这是前进的一步。

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

有用的资源

The flysystem original documentation

  • 关于 flysystem 包的详细信息,并描述了 laravel 文档中未涉及的方法,例如 getMimetype。

Laravel docs

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

The AWS Sdk guide for PHP

  • 如果您想编写自定义 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

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

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

结果

A cute hamster

上图获取s3 url: https://s3.eu-central-1.amazonaws.com/bucketname/resource-22

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

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

关于php - 使用 laravel 5.1 文件系统时如何将 s3 对象字符串变成有用的东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30922716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com