使用Laravel动态读取S3文件

时间:2017-03-20 19:11:51

标签: php laravel amazon-s3 laravel-5

我目前正在开发一个连接到包含多个图像文件的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'));

    }

}

1 个答案:

答案 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

这也是一个关于雄辩的非常好的系列,它并不那么难,但它需要一些时间来解决它