Php 使用Laravel动态读取S3文件
我目前正在从事一个Laravel项目,该项目连接到一个包含多个图像文件的AmazonS3存储桶。我正在尝试创建一个页面,该页面将根据bucket中的文件在页面加载时动态生成图像。我希望它能反映出图像是从页面还是从bucket本身添加或删除的 我曾尝试在网上寻找答案,但每个答案都有一个一致的想法,那就是我有/可以访问特定的文件URL。据我所知,我不能保证我会的,尽管我很容易出错 如果需要,我可以提供更多信息。非常感谢您的帮助或指导Php 使用Laravel动态读取S3文件,php,laravel,amazon-s3,laravel-5,Php,Laravel,Amazon S3,Laravel 5,我目前正在从事一个Laravel项目,该项目连接到一个包含多个图像文件的AmazonS3存储桶。我正在尝试创建一个页面,该页面将根据bucket中的文件在页面加载时动态生成图像。我希望它能反映出图像是从页面还是从bucket本身添加或删除的 我曾尝试在网上寻找答案,但每个答案都有一个一致的想法,那就是我有/可以访问特定的文件URL。据我所知,我不能保证我会的,尽管我很容易出错 如果需要,我可以提供更多信息。非常感谢您的帮助或指导 在完成以下所有操作和一些额外的修补之后,我现在面临以下错误: 未
在完成以下所有操作和一些额外的修补之后,我现在面临以下错误: 未定义变量:images(视图:C:\…\upload.blade.php 到目前为止,我将发布我的代码片段,以便更好地说明可能出现的问题: (日期)。创建图片\u table.php
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateImagesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('images', function (Blueprint $table) {
$table->increments('id');
$table->string('image_path');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('images');
}
}
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Image extends Model
{
protected $guarded = [];
}
....
<form action="{{ url('upload') }}" method="post" enctype="multipart/form-data" style="padding-top: 10px;">
{{ csrf_field() }}
<input type="file" name="image" id="fileToUpload">
<div style="text-align: center">
<button type="submit" class="btn-default" style="margin-top: 15px;">Upload Image</button>
</div>
</form>
@foreach ($images as $image)
<div class="col-md-3 col-sm-12 panel panel-default widget" style="text-align: center; padding: 10px;margin-right: 10px;">
<div>
<img src="{{ $image->image_path }}">
</div>
</div>
@endforeach
....
<?php
namespace App\Http\Controllers;
use App\Image;
use Illuminate\Http\Request;
use Storage;
class UploadController extends Controller
{
public function fileUpload(Request $request)
{
/*$this->validate($request, [
'image' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
]);*/
$imageName = time().'.'.$request->image->getClientOriginalExtension();
$image = $request->file('image');
$image = Image::make($image);
$t = Storage::disk('s3')->put($imageName, file_get_contents($image), 'public');
$imageName = Storage::disk('s3')->url($imageName);
$image = Image::create(['image_path' => $imageName]);
$images = Image::all();
return view('/upload', compact('images'));
}
}
嗯,我首先要做的是将S3上存在的所有文件注册到您的数据库中,然后您可以从数据库中返回x数量的随机图片,并从S3中获取它们 从给定表返回10个随机行的普通MySQL查询:
SELECT * FROM images ORDER BY RAND() LIMIT 10
拉威尔之路:
$images = Images::orderByRaw('RAND()')->take(10)->get();
然后,您可以在视图中执行以下操作:
@foreach($images as $image)
<img src="https://xxx.s3.amazonaws.com/{{ $image->path }}">
// OR
<img src="{{ $image->s3_url }}">
@endforeach
编辑:
为了澄清我的答案,$images变量包含从数据库中随机选择的行
$images = Images::get();
这将返回数据库中的所有图像,images::
引用您正在使用的雄辩模型,就像每个Laravel安装中提供的用户模型一样。例如,user::get();
这将返回用户表中的所有用户
为了检索所有图像(或用户),您需要一个图像模型
php artisan make:model images
在你的应用程序文件夹中,你现在可以找到Images.php,这是模型,在这里你可以指定模型的任何关系。我不会在这里详细介绍,因为这会很快让人困惑
如果它仍然不是100%清楚,我建议看一些关于雄辩的模型和拉威尔的教程
官方文件->
这个链接有一些非常好和清晰的教程,描述了我的意思,从第6集开始,他谈论的是简单的数据库交互
这也是一个关于雄辩的非常好的系列,这并不难,但是你需要一些时间来了解它,我首先要做的是将S3上的所有文件注册到你的数据库中,然后你可以从数据库返回x数量的随机图片,并从S3获取它们 从给定表返回10个随机行的普通MySQL查询:
SELECT * FROM images ORDER BY RAND() LIMIT 10
拉威尔之路:
$images = Images::orderByRaw('RAND()')->take(10)->get();
然后,您可以在视图中执行以下操作:
@foreach($images as $image)
<img src="https://xxx.s3.amazonaws.com/{{ $image->path }}">
// OR
<img src="{{ $image->s3_url }}">
@endforeach
编辑:
为了澄清我的答案,$images变量包含从数据库中随机选择的行
$images = Images::get();
这将返回数据库中的所有图像,images::
引用您正在使用的雄辩模型,就像每个Laravel安装中提供的用户模型一样。例如,user::get();
这将返回用户表中的所有用户
为了检索所有图像(或用户),您需要一个图像模型
php artisan make:model images
在你的应用程序文件夹中,你现在可以找到Images.php,这是模型,在这里你可以指定模型的任何关系。我不会在这里详细介绍,因为这会很快让人困惑
如果它仍然不是100%清楚,我建议看一些关于雄辩的模型和拉威尔的教程
官方文件->
这个链接有一些非常好和清晰的教程,描述了我的意思,从第6集开始,他谈论的是简单的数据库交互
这也是一个关于雄辩的非常好的系列,这并不难,但是你需要一些时间来了解它首先,$images变量是在哪里建立的?它必须包含任何随机化吗?其次,你提到将图像存储在“数据库”中而不是S3本身,但我不能告诉代码的哪一部分解决了这个问题(为了记录,我刚刚创建了一个MySQL表“images”,其中包含一个“image”varchar列).你能澄清一下吗?@Alexander我已经更新了我的答案,我强烈建议看一下laracasts的最后两个链接,浏览所有视频需要一些时间,但它会在很多方面帮助你;)我正在关注你提供的内容,目前我面临一个新的错误。我已经更新了我的问题,加入了代码片段,这样你就可以更好地看到潜在的问题区域。从头开始,找出问题所在:在上传请求之后,我太专注于尝试传递$images,以至于在初始加载时忘了传递它。现在一切都很好。非常感谢你的帮助,Illyas.)首先,$images变量在哪里建立?它必须包含任何随机化吗?第二,您提到将图像存储在“数据库”中,而不是存储到S3本身,但我无法判断代码的哪一部分解决了这个问题(为了记录,我刚刚创建了一个MySQL表“images”,其中包含一个“image”varchar列)。你能澄清一下吗?@Alexander我已经更新了我的答案,我强烈建议看一下laracasts的最后两个链接,浏览所有视频需要一些时间,但它会在很多方面帮助你;)到目前为止,我一直在关注您提供的内容,目前我面临一个新的错误。我已经更新了我的问题,加入了代码片段,这样你就可以更好地看到潜在的问题区域。从头开始,找出问题所在:在上传请求之后,我太专注于尝试传递$images,以至于在初始加载时忘了传递它。一切正常