这是我第一次尝试在laravel中上传和存储图像。我有一个形式,我要上传,存储在数据库和显示图像的食品类别。我检查了laravel文档,其他类似的问题,甚至看了youtube教程,但我想我在很多方面都迷失了方向,最终我什么都不懂。我尝试了几种方法,但我得到了不同的错误类型。如果这里有人可以帮助我如何做一个例子,我将非常感激!
这是我在我的控制器中存储功能(在开始尝试上传之前,存储在db中并显示图像):
public function store(Request $ Request){
$category = new AppCategory();
$category->title = $request->get('title');
$category->imagename = $request->get('imagename');
$category->featured = $request->has('featured');
$category->active = $request->has('active');
$category->save();
session()->flash('success', "Category '{$category->title}' has been created.");
return redirect()->route('category.index');
}
这是create.blade:
中的HTML<form method="post" enctype="multipart/form-data" action="{{ route('category.store') }}" >
<label for="title">Title</label><br>
<input type="text" name="title" placeholder="Enter title" value="{{old('title')}}"><br>
<label for="imagename">Image</label><br>
<input type="file" name="imagename" id="imagename"><br>
<label for="featured">Featured</label><br>
<input type="checkbox" name="featured" value="1"><br>
<label for="active">Active</label><br>
<input type="checkbox" name="active" value="1"><br>
<input type="hidden" name="_token" value="{{ csrf_token() }}" /><br>
<input type="submit" name="submit" value="Add Category" class="btn-secondary">
</form>
首先,您需要在config/filesystems.php
上配置存储配置。默认情况下,文件将在storage/app/public
上传,在保存图像的功能中,您可以使用storeAs()
方法。
但是在数据库中你要存储图像路由,如下面的示例代码:
$format = $file->getClientOriginalExtension();
//generate file name
$fileName = time() . rand(1, 999999) . '.' . $format;
// generate route name + $filename
$path = 'storage/' . $fileName;
//store file
$file->storeAs('public/posts', $fileName);
$create = $postImage->create([
'name' => $fileName,
'format' => $format,
'url' => $path,
'path' => $path,
]);
如果你需要更多关于这个过程的信息,你可以查看这个Laravel文档页面。
上传base64文件到DB,会增加DB的大小
$ImageObject = $ImageGallery::find($galleryId);
$ImageObject->galleryContent= base64_decode($request->image);
$ImageObject->save();
最好是将文件上传到本地存储或其他静态存储。
Laravel提供了一个强大的文件系统抽象,这要感谢Frank de Jonge提供的美妙的Flysystem PHP包。Laravel Flysystem集成为本地文件系统、Amazon S3和Rackspace云存储提供了简单易用的驱动程序。更棒的是,在这些存储选项之间切换非常简单,因为每个系统的API都是相同的。
参考:https://laravel.com/docs/5.8/filesystem
在那里你可以上传文件到磁盘,它可以是公共/本地/S3其他。
默认laravel提供上传文件到磁盘这样
$fileName = 'filenamewith full path & extension';
$scope = 'public/private/limited';
$content = base64_encode($content);
Storage::disk('local')->put($fileName,$content,$scope); // Uploading to local disk
Storage::disk('s3')->put($fileName,$content,$scope); // Uploading to S3 Bucket
你可以从filesystems.php更改配置(配置→filesystems.php)
'disks' => [
'local' => [
'driver' => 'local',
'root' => storage_path('app').'/aws/',
],
'public' => [
'driver' => 'local',
'root' => storage_path('app/public/aws/'),
'url' => env('APP_URL') . '/storage',
'visibility' => 'public',
],
's3' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION'),
'bucket' => env('AWS_BUCKET'),
'url' => env('AWS_URL'),
],
],
。
正如@Alberto Sinigaglia提到的,不建议将图像直接存储在数据库中,但是有一些方法可以做到这一点。其中之一是将其转换为base64字符串,然后像这样存储字符串…
$category->imagename = base64_encode(file_get_contents($request->file('imagename')->path()));
$category->save();
一种更好的方法是使用Laravel将图像存储在服务器上,然后将公共url保存到数据库…
//Store image in public folder
$image = $request->file('imagename')->store('public');
//Save url to image
$category->imagename = asset($image);
$category->save();
此方法的变体在文档中https://laravel.com/docs/8.x/filesystem文件上传