我目前正在开发一个连接到包含多个图像文件的Amazon S3存储桶的Laravel项目。我正在尝试创建一个页面,在页面加载时根据存储桶中的文件动态生成图像。我希望它可以反映从页面或存储桶本身添加或删除图像的时间。
我试图在线寻找答案,但是每个人都有一个一致的部分是我/可以访问特定文件URL的想法。根据我的理解,我不能保证我会这样做,尽管我很容易出错。
如果需要,我可以提供更多信息。非常感谢任何帮助或指导。
在完成以下所有内容以及一些额外的修补之后,我现在面临以下错误:
未定义的变量:images(查看:C:\ ... \ upload.blade.php
到目前为止,我会发布我的代码片段,以便更好地展示可能存在的问题:
(日期).create_images_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');
}
}
Image.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Image extends Model
{
protected $guarded = [];
}
upload.blade.php
....
<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
....
UploadController.php
<?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'));
}
}
答案 0 :(得分:2)
嗯,我首先要做的是在数据库中注册S3上的所有文件,然后你可以从数据库返回x量的随机图片并从S3获取。
普通MySQL查询,返回给定表中的10个随机行:
SELECT * FROM images ORDER BY RAND() LIMIT 10
laravel方式:
$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
在您的数据库中,您必须将URL或路径放在S3上。上传到S3时,不要直接对s3进行操作,在laravel中为您的图像创建一个简单的上传页面,并在上传成功时将它们存储在数据库中。
Laravel关于在云提供商上存储文件的文档: https://laravel.com/docs/5.4/filesystem
关于S3和Laravel的一些很好的教程: https://murze.be/2015/07/upload-large-files-to-s3-using-laravel-5/ https://return-true.com/uploading-directly-to-amazon-s3-from-your-laravel-5-application/
用于laravel的官方S3 SDK https://github.com/aws/aws-sdk-php-laravel
编辑:此软件包比官方SDK更好地维护:https://github.com/thephpleague/flysystem-aws-s3-v3
将所有内容放在一个简单的头像上传功能
中public function uploadAvatar(Request $request)
{
$this->validate($request, [
'avatar' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
]);
// Handle the user upload of avatar
if($request->hasFile('avatar')){
$avatar = $request->file('avatar');
$filename = time() . '.' . $avatar->getClientOriginalExtension();
$avatar = Image::make($avatar)->resize(300, 300);
$avatar = $avatar->stream();
//Store to S3
$res = \Storage::disk('s3')->put('avatars/' . $filename, $avatar->__toString());
// Save filename to database
$user = Auth::user();
$user->avatar = $filename;
$user->save();
Alert::success('Profiel foto gewijzigd!');
return Redirect::back();
}
Alert::error(trans('messages.whoops'));
return Redirect::back();
}
编辑:
澄清我的答案; $ images变量包含数据库中随机选择的行
$images = Images::get();
这将返回数据库中的所有图像,Images::
指的是您正在使用的雄辩模型,例如每个Laravel安装中提供的用户模型。例如。 User::get();
这将返回用户表中的所有用户。
要检索所有图像(或用户),您需要一个图像模型。您可以使用以下命令创建它;
php artisan make:model images
在您的app文件夹中,您将找到Images.php,这是模型,您可以在此处指定模型具有的任何关系。我不会在这里详细说明,因为这可能会非常快速地混淆。
如果它还不是100%清晰,我建议你查看一些有关Eloquent Models和laravel的教程。
官方文档 - &gt; https://laravel.com/docs/5.4/eloquent
https://laracasts.com/series/laravel-5-from-scratch
这个链接有一些非常好的和清晰的教程描述了我的意思,从第6集开始他谈的是简单的数据库交互。
https://laracasts.com/series/advanced-eloquent
这也是一个关于雄辩的非常好的系列,它并不那么难,但它需要一些时间来解决它