laravel 多图上传及图片的存储例子

yizhihongxing

下面是关于 Laravel 多图上传及图片存储的攻略:

准备工作

在开始实现多图上传和图片存储的过程之前,你需要先进行以下准备工作:

  1. 确认你已经安装了 Laravel 框架并配置好了数据库连接。

  2. 安装并使用了 Laravel Collective 表单扩展包,以便在 Blade 模板中使用表单控件。

  3. 准备工作完成后,我们需要执行以下命令来安装 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技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 192.168.1.1或192.168.0.1路由器常用密码小结

    192.168.1.1或192.168.0.1路由器常用密码小结 什么是192.168.1.1和192.168.0.1 在局域网中,为了让多个设备能够互相通信,需要使用路由器来进行网络连接。路由器通常会有一个默认的IP地址作为登录地址,常见的包括192.168.1.1和192.168.0.1两个地址。 如何登录路由器 使用路由器的管理界面需要登录路由器。当输…

    other 2023年6月27日
    00
  • Java递归方法求5!的实现代码

    首先,Java递归方法可以通过函数内部不断地调用自身来实现重复的任务。对于求5!(即5的阶乘)的问题,可以使用递归方法来解决。 阶乘的定义是:n! = n * (n-1) * (n-2) * … * 2 * 1,其中0! = 1。 下面是求5!的完整Markdown格式的Java递归方法实现代码: public static int factorial(…

    other 2023年6月27日
    00
  • ubuntu菜鸟入门(十二)——主题美化

    Ubuntu菜鸟入门(十二)——主题美化 Ubuntu是一款流行的Linux操作系统,它提供了丰富的主题和图标,可以帮助用户美化桌面界面。本攻略将介绍如何在Ubuntu中进行主题美化。 安装主题和图标 在Ubuntu中,可以通过以下步骤安装主题和图标: 打开终端,使用以下命令添加PPA: bash sudo add-apt-repository ppa:no…

    other 2023年5月9日
    00
  • Python单例模式实例详解

    Python单例模式实例详解 单例模式是一种常见的设计模式之一,它保证一个类有且只有一个实例,并且提供了一个全局访问点。Python中可以用多种方式实现单例模式,比如使用模块、装饰器、元类等。接下来我们分别介绍这三种方式的实现方法,并给出示例说明。 使用模块实现单例模式 Python中的模块天生就是单例的,因为导入一个模块时,模块只会被加载一次并且一直可用。…

    other 2023年6月27日
    00
  • Python即时网络爬虫项目: 内容提取器的定义

    Python即时网络爬虫项目: 内容提取器的定义 网络爬虫是一种自动化程序,可按照预定规则自动抓取指定网站的数据。不过,在获取网站数据后,我们需要从中提取出有用的内容。本文介绍的是 Python 即时网络爬虫项目中关于内容提取器的定义。 内容提取器是什么? 内容提取器是一种用于从网页中提取特定数据的程序。与页面解析器不同,内容提取器专注于提取内容而不是解析页…

    其他 2023年3月28日
    00
  • 多线程CSerialPort类的多串口通信实现

    多线程CSerialPort类是一种用于实现多串口通信的C++类库。在本文中,我们将详细介绍如何使用多线程CSerialPort类实现多串口通信,并提供两个示例说明。 多线程CSerialPort类的使用方法 步骤1:下载和安装多线程CSerialPort类库 多线程CSerialPort类库可以从互联网上下载,下载后需要将其安装到本地计算机上。安装方法因类…

    other 2023年5月5日
    00
  • 详述Windows Server 2008安全部署的六个方面

    详述Windows Server 2008安全部署的六个方面: 服务器硬件和操作系统的安全性 在安装Windows Server 2008之前,需要检查服务器硬件的物理安全性。服务器的物理访问权限必须受到保护,确保没有任何未经授权的人员能够访问服务器。此外,在安装和配置操作系统时,需要采取一系列措施来保护服务器的安全性。这些措施包括设置强密码、启用防火墙、关…

    other 2023年6月27日
    00
  • php微信公众平台开发之获取用户基本信息

    以下是详细讲解”php微信公众平台开发之获取用户基本信息”的完整攻略: 什么是微信公众平台开发? 微信公众平台开发是指通过微信公众平台开发,可以实现一系列基于微信的业务,在微信上面实现自己的业务,从而达到与用户有效交互的目的。其中,获取用户基本信息是公众平台开发中很重要的一个步骤。 获取用户基本信息的流程 获取用户基本信息可以分为以下几个步骤:1. 获取用户…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部