下面是关于 Laravel 多图上传及图片存储的攻略:
准备工作
在开始实现多图上传和图片存储的过程之前,你需要先进行以下准备工作:
-
确认你已经安装了 Laravel 框架并配置好了数据库连接。
-
安装并使用了 Laravel Collective 表单扩展包,以便在 Blade 模板中使用表单控件。
-
准备工作完成后,我们需要执行以下命令来安装 Intervention Image 图像处理扩展包用于图片文件的裁剪、缩放等操作。
composer require intervention/image
实现多图上传
在实现多图上传的过程中,我们需要使用到 Laravel 自带的表单控件 file
,将其设置为 multiple
即可实现多图上传的功能。在页面中添加以下 HTML 代码:
<form action="/upload" method="post" enctype="multipart/form-data">
@csrf
<input type="file" name="images[]" multiple>
<button type="submit">上传图片</button>
</form>
在提交表单后,接下来在控制器中处理上传的文件,将其保存到服务器上。
public function upload()
{
// 验证上传的文件是否真的是图片文件,限制上传文件的类型及其大小。
request()->validate([
'images' => 'required|array',
'images.*' => 'required|image|max:2048',
]);
$images = request()->file('images');
$paths = [];
// 处理多张图片的上传
foreach ($images as $image) {
$filename = $image->hashName();
$path = $image->store('public/images');
$paths[] = $path;
}
// 返回上传完成后的图片路径
return $paths;
}
在控制器中,request()
函数可以获取到通过表单上传的文件,使用 validate
方法可以对上传的文件进行验证,限制其类型及大小等。
我们使用 store
方法将上传的文件保存到服务器的 storage/app/public/images
目录下,并返回该文件的路径(默认存储路径是在 storage/app
目录下)。在此处我们只返回了图片的路径,传递给前端显示。
实现图片的存储
上传图片成功后,我们需要将其重新命名、缩放等处理,然后将其保存到数据库中。这里我们仍然使用 Intervention Image 扩展包来完成上述操作。
首先,我们需要修改 config/app.php
文件中 providers
选项的配置,将 Intervention\Image\ImageServiceProvider
添加进去,即:
'providers' => [
// ...
Intervention\Image\ImageServiceProvider::class,
],
还需添加一个 aliases
配置项,将 InterventionImage
作为一个 Facade 类来使用:
'aliases' => [
// ...
'InterventionImage' => Intervention\Image\Facades\Image::class,
],
完成上述配置后,我们便可以在控制器中使用 InterventionImage
来处理上传的图片文件了。
public function upload()
{
// 验证上传的文件是否真的是图片文件,限制上传文件的类型及其大小。
request()->validate([
'images' => 'required|array',
'images.*' => 'required|image|max:2048',
]);
$images = request()->file('images');
$paths = [];
// 处理多张图片的上传
foreach ($images as $image) {
$filename = $image->hashName();
$path = $image->store('public/images');
// 将图片重命名并进行缩放处理
$img = InterventionImage::make(storage_path("app/$path"));
$img->fit(1000, 1000);
$newpath = "public/thumbs/" . $filename;
Storage::put($newpath, (string) $img->encode());
// 将图片信息保存到数据库中
$picture = new Picture();
$picture->name = $filename;
$picture->path = $path;
$picture->thumb = $newpath;
$picture->save();
}
return $paths;
}
上述代码中,我们使用 InterventionImage::make
方法来生成一个图片处理对象,调用 fit
方法进行缩放,并设置图片的压缩质量。
在缩放完成后,我们将其保存到服务器的目录 public/thumbs
中,并将该图片的信息保存到数据库中。
示例说明
下面我们使用两个示例来说明如何实现多图上传及图片的存储。
示例一:基础版多图上传及存储
假设我们现在需要设计一个页面,用户可以在该页面上传自己的图片,然后管理员可以在后台管理页面中对已上传的图片进行管理(包括查看、下载、删除等)。
在前端,我们可以创建一个上传图片的页面,让用户选择自己所需要上传的图片,然后提交给服务器。
<form action="/upload" method="post" enctype="multipart/form-data">
@csrf
<input type="file" name="images[]" multiple>
<button type="submit">上传图片</button>
</form>
在控制器部分,实现多图上传和图片的存储。
public function upload()
{
// 验证上传的文件是否真的是图片文件,限制上传文件的类型及其大小。
request()->validate([
'images' => 'required|array',
'images.*' => 'required|image|max:2048',
]);
$images = request()->file('images');
$paths = [];
// 处理多张图片的上传
foreach ($images as $image) {
$filename = $image->hashName();
$path = $image->store('public/images');
$paths[] = $path;
$picture = new Picture();
$picture->name = $filename;
$picture->path = $path;
$picture->save();
}
return $paths;
}
在数据库表中,我们需要保存图片的信息,包括图片的名称、原图路径、缩略图路径等。
Schema::create('pictures', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('path');
$table->string('thumb');
$table->timestamps();
});
当管理员需要查看和管理图片信息时,可以使用以下代码进行查询:
$pictures = Picture::all();
foreach ($pictures as $picture) {
echo $picture->name . ':' . asset('storage/' . $picture->path) . '<br>';
echo '缩略图:' . asset('storage/' . $picture->thumb) . '<br>';
echo '<a href="' . asset('storage/' . $picture->path) . '">下载</a>';
}
在上述代码中,我们使用 asset
函数获取图片的路径,以便在前端页面中显示图片信息。
示例二:裁剪版多图上传及存储
假设我们现在需要设计一个页面,用户可以在该页面上传自己的图片,并对图片进行裁剪、缩放等操作,然后管理员在后台管理页面中可以查看已上传图片的信息。
在前端,我们可以引入 Cropper.js 这个 JavaScript 插件来实现图片的裁剪、缩放等操作。
<form action="/upload" method="post" enctype="multipart/form-data">
@csrf
<input type="file" name="images[]" multiple>
<div class="preview"></div>
<button type="submit">上传图片</button>
</form>
<script src="https://cdn.bootcss.com/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/cropperjs/1.5.9/cropper.js"></script>
<script>
$(function () {
$('input[name="images[]"]').change(function (event) {
$('.preview').html('');
var files = event.target.files;
for (var i = 0; i < files.length; i++) {
var reader = new FileReader();
reader.onload = function (event) {
var image = new Image();
image.onload = function () {
var cropper = new Cropper(image, {
aspectRatio: 1 / 1,
viewMode: 1,
cropBoxResizable: false,
crop: function (event) {
$('input[name="imgcrop"]').val(JSON.stringify(event.detail));
},
});
};
image.src = event.target.result;
$('.preview').append(image);
};
reader.readAsDataURL(files[i]);
}
});
});
</script>
在控制器部分,我们需要对上传的图片进行裁剪、重命名等处理,并将其保存到数据库中。
public function upload()
{
// 验证上传的文件是否真的是图片文件,限制上传文件的类型及其大小。
request()->validate([
'images' => 'required|array',
'images.*' => 'required|image|max:2048',
'imgcrop' => 'sometimes|required|array',
]);
$images = request()->file('images');
$paths = [];
foreach ($images as $index => $image) {
$crop = isset(request()->imgcrop[$index]) ? request()->imgcrop[$index] : null;
$filename = $image->hashName();
$path = $image->store('public/images');
$paths[] = $path;
// 进行图片的裁剪和缩放
$img = InterventionImage::make(storage_path("app/$path"));
if ($crop) {
$img->crop(
$crop['width'],
$crop['height'],
$crop['x'],
$crop['y']
);
}
$img->fit(750, 750);
$newpath = "public/thumbs/" . $filename;
Storage::put($newpath, (string) $img->encode());
// 将图片信息保存到数据库中
$picture = new Picture();
$picture->name = $filename;
$picture->path = $path;
$picture->thumb = $newpath;
$picture->save();
}
return $paths;
}
在上述代码中,我们使用 jQuery 和 Cropper.js 来实现图片的裁剪和缩放操作,然后使用 InterventionImage
进行图片处理,最终将图片和其信息保存到数据库中。
在数据库表中,我们需要保存图片的信息,包括图片的名称、原图路径、缩略图路径等。
Schema::create('pictures', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('path');
$table->string('thumb');
$table->timestamps();
});
在管理员需要查看已上传图片的信息时,可以使用以下代码进行查询:
$pictures = Picture::all();
foreach ($pictures as $picture) {
echo $picture->name . ':' . asset('storage/' . $picture->path) . '<br>';
echo '缩略图:' . asset('storage/' . $picture->thumb) . '<br>';
echo '<a href="' . asset('storage/' . $picture->path) . '">下载</a>';
}
上述查询结果中,我们使用了 asset
函数获取图片的路径,以便在前端页面中显示图片信息。
以上就是关于 Laravel 多图上传及图片存储的攻略,希望对你有所帮助!
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:laravel 多图上传及图片的存储例子 - Python技术站