【问题标题】:Store S3 URL in database table将 S3 URL 存储在数据库表中
【发布时间】:2016-08-31 02:35:57
【问题描述】:

我正在 Laravel 5.2 中构建一个小型资产管理系统

用户可以将图像、视频等上传到应用程序,并且资产元数据存储在资产表中。在这种情况下,资产被重命名以匹配资产 ID(我也在存储原始文件名),我正在存储 mime 类型并将文件上传到 S3。

我遇到的问题是将 S3 url 存储在数据库中。

这是我的方法

public function store(AssetRequest $request)
    {

        // Initialise new asset and set the name
        // from the form
        $asset = new Asset(array(
            'name' => $request->get('name')
        ));

        $asset->user_id = Auth::user()->id;

        // save the asset to the db
        $asset->save();
        // set the file var = form input
        $file = $request->file('asset_path');
        $extension = $file->getClientOriginalExtension();
        // modify the asset name
        $assetFile = $asset->id . '.' . $request->file('asset_path')->getClientOriginalExtension();
        // push the new asset to s3
        Storage::disk('s3')->put('uploads/' . $assetFile, file_get_contents($file));
        $asset->mime = $file->getClientMimeType();
        $s3Url = Storage::url($file);
        $asset->s3_url = $s3Url;
        $asset->original_filename = $file->getClientOriginalName();
        $asset->filename = $assetFile;
        $asset->file_extension = $extension;
        // return ok
        $asset->save();
        return \Redirect::route('asset.create')->with('message', 'Asset added!');
    }

与我尝试存储 S3 url 相关的行

$s3Url = Storage::url($file); $asset->s3_url = $s3Url; 似乎只存储了一个临时路径 /storage//tmp/php8su2r0 而不是一个实际的 S3 url。我想避免手动设置存储桶,而是希望我可以使用config/filesystem.php中配置的内容@

有什么想法吗?

【问题讨论】:

    标签: php laravel amazon-s3 laravel-5.2


    【解决方案1】:

    您可以使用 config(key) 函数助手从配置中获取所有内容 因此要获取文件的 s3 公共 url,请执行以下操作:

    function publicUrl($filename){
            return "http://".config('filesystems.disks.s3.bucket').".s3-website.".config('filesystems.disks.s3.region').".amazonaws.com/".$filename;
        }
    

    或者你可以使用底层的S3Client:(taken from here)

    $filesystem->getAdapter()->getClient()->getObjectUrl($bucket, $key);
    

    【讨论】:

      【解决方案2】:

      您正在努力实现的目标,我在许多项目中都在这样做。

      您需要做的就是在数据库中创建 image_url 列。并传递s3桶链接+文件名+扩展名。

      您应该知道对我来说不变的位,例如:https://s3-eu-west-1.amazonaws.com/backnine8/fitness/events/ 然后我有 id 和扩展名。在您的情况下,它可能是名称和扩展名。

      if(Input::get('file')) {
      
              $extension = pathinfo(Input::get('filename'), PATHINFO_EXTENSION);
              $file = file_get_contents(Input::get('file'));
      
              $s3 = AWS::get('s3');
      
              $s3->putObject(array(
                  'ACL'        => 'public-read',
                  'Bucket'     => 'backnine8',
                  'Key'        => '/fitness/events/'.$event->id.'.'.$extension,
                  'Body' => $file,
              ));
      
              $event->image_url = 'https://s3-eu-west-1.amazonaws.com/backnine8/fitness/events/'.$event->id.'.'.$extension;
      
              $event->save();
      
              }
      

      【讨论】:

      • 是的,我已经在数据库中有 url 列。 $event->image_url = 'https://s3-eu-west-1.amazonaws.com/backnine8/fitness/events/'.$event->id.'.'.$extension; 对我来说很容易,但是您已经有效地对存储桶进行了两次硬编码。我宁愿没有任何硬编码
      • @StevenGrant 只需使用我给您的将存储桶放入配置并从配置中获取其名称,因此如果您需要切换存储桶名称,唯一可以更改的地方是在配置中
      猜你喜欢
      • 2019-08-10
      • 1970-01-01
      • 2013-05-14
      • 2023-02-26
      • 2013-08-14
      • 1970-01-01
      • 2016-10-20
      • 1970-01-01
      • 2021-09-30
      相关资源
      最近更新 更多