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

下面是关于 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日

相关文章

  • 微信开发者工具如何修改模拟器位置 微信开发者工具修改模拟器位置教程

    微信开发者工具如何修改模拟器位置 微信开发者工具提供了模拟器的功能,可以在开发过程中方便地预览和调试小程序。有时候我们需要修改模拟器的位置,以适应不同的预览场景。本文将详细讲解如何修改微信开发者工具中模拟器的位置。 步骤 步骤1:进入开发者工具 首先,我们需要进入微信开发者工具,并打开自己的小程序项目。 步骤2:打开模拟器 在开发者工具的顶部菜单栏中,可以找…

    other 2023年6月26日
    00
  • MyBatis-Plus 查询指定字段的实现

    让我来详细讲解“MyBatis-Plus 查询指定字段的实现”的完整攻略。 1. 环境准备 首先确保你已经准备好了以下环境: Java 8+ MyBatis-Plus 3.0+ 如果你还没有安装 MyBatis-Plus,可以使用 Maven 进行安装,添加以下依赖即可: <dependency> <groupId>com.baomi…

    other 2023年6月25日
    00
  • bioconductor应用领域之基因芯片

    Bioconductor应用领域之基因芯片 基因芯片简介 基因芯片(gene chip)是一种高通量生物芯片,可用于同时检测和分析大量基因的表达和变异情况。基因芯片是通过制备与已知基因序列互补的核酸探针,用于探测样本中存在的基因表达或DNA变异信息。基因芯片技术的广泛应用已经在许多领域取得成功,并成为生物医学研究的重要工具之一。 Bioconductor简介…

    其他 2023年3月28日
    00
  • 非公版GTX 1080哪个好?8款GeForce GTX1080全面深度对比评测

    以下是对非公版GTX 1080的全面深度对比评测的攻略: 硬件规格比较 首先,我们需要比较不同非公版GTX 1080显卡的硬件规格。这包括核心频率、显存容量、显存频率等。通过比较这些规格,我们可以了解不同显卡之间的性能差异。 示例说明1:例如,GTX 1080 A显卡的核心频率为1607MHz,显存容量为8GB,显存频率为10000MHz;而GTX 1080…

    other 2023年10月17日
    00
  • 一台电脑上怎么设置两个IP地址?

    在一台电脑上设置两个IP地址可以通过以下步骤完成: 打开网络设置:在Windows操作系统中,点击任务栏右下角的网络图标,选择“网络和Internet设置”。在Mac操作系统中,点击屏幕右上角的Wi-Fi图标,选择“网络偏好设置”。 进入网络设置:在Windows中,点击“更改适配器选项”,在Mac中,点击左侧的网络连接类型(如Wi-Fi或以太网)。 配置第…

    other 2023年7月30日
    00
  • 基于jquery的简单富文本编辑器

    基于jQuery的简单富文本编辑器 随着Web应用程序的发展,越来越多的用户希望能够在网页中直接进行富文本编辑。市面上有许多优秀的开源富文本编辑器,其中使用最广泛的是基于JavaScript的开源富文本编辑器。在这里,我们将介绍一个基于jQuery的简单富文本编辑器。 使用jQuery构建富文本编辑器 jQuery是一个功能强大、使用方便、兼容性良好的Jav…

    其他 2023年3月28日
    00
  • 图文详解java内存回收机制

    图文详解Java内存回收机制 1. 引言 Java内存回收机制是Java虚拟机(JVM)的重要组成部分,它负责管理和回收程序运行过程中产生的垃圾对象。垃圾对象是指那些不再被程序使用的对象,占用内存空间但无法被访问到的对象。Java内存回收机制通过自动回收这些垃圾对象来释放内存空间,提高程序的性能和效率。 2. Java内存模型 在深入了解Java内存回收机制…

    other 2023年8月2日
    00
  • Asp.net中使用文本框的值动态生成控件的方法

    当我们在Asp.net开发中需要在页面中根据用户输入的内容动态生成控件时,可以利用输入的文本框的值来生成控件。下面是实现的详细步骤: 1、动态生成控件 在Asp.net中,我们可以通过代码动态生成控件。首先,我们需要在代码中将文本框的值获取到,然后通过循环的方式创建控件。代码示例: protected void btnCreate_Click(object …

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