我正在Laravel 5.2中构建一个小型资产管理系统
用户可以将图像,视频等上传到应用程序,资产元数据存储在资产表中。当发生这种情况时,资产被重命名以匹配资产ID(我也存储原始文件名),我正在存储mime类型并将文件上传到S3。
我已经解开的地方是将S3网址存储在数据库中。
这是我的方法
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网址有关的行
$s3Url = Storage::url($file);
$asset->s3_url = $s3Url;
似乎只存储临时路径/storage//tmp/php8su2r0
而不是实际的S3网址。我想避免手动设置存储桶,而是希望我可以使用config/filesystem.php
中配置的内容
有什么想法吗?
答案 0 :(得分: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);
答案 1 :(得分:0)
你想要实现的目标,我在许多项目中都这样做。
您需要做的就是在数据库中创建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();
}