Laravel实现图片上传接口以及图片压缩优化测试

news/2024/9/13 23:36:13/ 标签: laravel, php

1. 创建 Laravel 项目

确保你已经安装了 Laravel 和相关依赖。创建一个新的 Laravel 项目:

composer create-project --prefer-dist laravel/laravel image-upload
cd image-upload

2. 设置数据库

编辑 .env 文件以连接到你的数据库,然后运行迁移:

php artisan migrate

3. 创建控制器

使用 Artisan 命令创建一个控制器:

php artisan make:controller ImageController --resource

4. 实现上传逻辑

打开 app/Http/Controllers/ImageController.php 并添加以下方法:

php"><?phpnamespace App\Http\Controllers;use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Validator;class ImageController extends Controller
{/*** Store a newly created resource in storage.** @param  \Illuminate\Http\Request  $request* @return \Illuminate\Http\JsonResponse*/public function store(Request $request){// 验证请求数据$validator = Validator::make($request->all(), ['image' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048',]);if ($validator->fails()) {return response()->json($validator->errors(), 422);}// 保存图片到 storage/app/public/images 目录$path = $request->file('image')->store('public/images');// 返回响应return response()->json(['message' => 'Image uploaded successfully.','path' => Storage::url($path),]);}
}

5. 添加路由

routes/api.php 中添加路由:

php">use App\Http\Controllers\ImageController;Route::post('/images', [ImageController::class, 'store']);

6. 使用场景

  • 用户上传个人头像
  • 商家上传商品图片
  • 用户上传评论中的附件图片

7. 优化建议

7.1 文件存储位置
  • 云存储服务:使用 Amazon S3 或其他云存储服务来存储图片,以减轻服务器的存储压力。
  • 本地存储:如果使用本地存储,考虑使用符号链接将 storage/app/public 映射到 public/storage,这样可以直接通过 HTTP 访问这些文件。你需要在 config/filesystems.php 文件中配置 public 存储盘。
7.2 图片处理
  • 调整大小和压缩:使用 Intervention Image 或者 Laravel 的内置功能来调整图片大小、压缩等,以减少存储空间占用和带宽消耗。
  • 多尺寸生成:根据不同的展示需求生成不同尺寸的图片版本。
7.3 安全性
  • 严格验证:对上传文件类型进行严格验证,防止恶意文件上传。
  • 直接写入文件:使用 Storage::put() 方法直接从二进制流写入文件,避免客户端上传可能带来的安全风险。
7.4 性能
  • 缓存机制:在生产环境中使用缓存机制来提高访问速度。
  • CDN 加速:使用 CDN 来加速图片加载速度。
7.5 错误处理
  • 详细错误信息:增加更详细的错误处理逻辑,例如当文件上传失败时返回具体原因。

8. 配置符号链接

如果你选择使用本地存储,需要在项目根目录下执行以下命令来创建符号链接:

php artisan storage:link

9. 配置云存储

如果你选择使用云存储,比如 Amazon S3,则需要在 config/filesystems.php 中配置 s3 存储盘,并且在 ImageController 中修改存储路径和获取 URL 的方式。

10. 测试

你可以使用 Postman 或 curl 来测试你的 API。例如使用 curl:

curl -X POST http://localhost/api/images \-F "image=@/path/to/image.jpg" \-H "Content-Type: multipart/form-data"

以上就是基于 Laravel 框架实现图片上传接口的详细步骤。


http://www.ppmy.cn/news/1516363.html

相关文章

深入探索fs.WriteStream:Node.js文件写入流的全面解析

在Node.js中&#xff0c;fs模块不仅提供了读取文件的API&#xff0c;还包含了写入文件的工具&#xff0c;其中fs.WriteStream就是一个非常重要的类&#xff0c;用于以流的形式将数据写入文件。本文将全面讲解fs.WriteStream的基本概念、使用方法、事件处理以及高级应用&#xf…

在Linux系统下配置IP地址的方法

在Linux系统下配置IP地址可以使用以下几种方法&#xff1a; 1.使用ifconfig命令&#xff1a; 打开终端&#xff0c;并以root权限登录。 输入ifconfig命令查看当前网络接口的配置信息。 使用ifconfig <interface> <IP_address> netmask <subnet_mask>命令…

【Java日志系列】Logback日志框架

目录 前言 一、Logback简介 二、Logback组件 三、快速入门 四、配置文件的使用 1. 配置文件中的标签 1.1 logger标签 1.2 root标签 1.3 appender标签 1.4 filter标签 1.5 encoder标签 1.6 property标签 2. 常见的Appender 2.1 ConsoleAppender 2.2 FileAppender…

C# SignalR 实时通信:构建动态交互的秘诀

标题&#xff1a;C# SignalR 实时通信&#xff1a;构建动态交互的秘诀 摘要 SignalR 是 ASP.NET Core 的一个库&#xff0c;它简化了在应用程序中添加实时通信的过程。无论是聊天应用、实时游戏还是协作工具&#xff0c;SignalR 都能提供高效且易于实现的解决方案。本文将深入…

Windows—UDP编程

Client骨架&#xff1a; #include <iostream> #include <WinSock2.h> #pragma comment(lib,"ws2_32.lib")int main() {//启动Winsock DLLWORD wVersionRequested MAKEWORD(2, 2);WSADATA lpWSAData;WSAStartup(wVersionRequested, &lpWSAData);//…

dbeaver数据库工具配置连接openGauss5.0

在DBeaver数据库工具中配置连接openGauss 5.0&#xff0c;可以通过以下步骤进行&#xff1a; 一、准备工作 下载openGauss JDBC驱动&#xff1a; 访问openGauss的官方网站&#xff08;如https://opengauss.org/zh/&#xff09;&#xff0c;下载适用于您操作系统的JDBC驱动。对…

浪潮服务器NVME 硬盘通过 Intel VROC 做RAID

INTEL VROC Configuration solution 1.VMD configuration in BIOS Processor > IIO Configuration> Intel(R) VDM Technology> Intel(R) VMD for volume Management Device on Socket 0 “CPU 0”, Intel VMD for volume management device for “PStack0” or “PSta…

C# 匿名函数 delegate(参数...){ }

什么是匿名函数 顾名思义&#xff0c;就是没有名字的函数 匿名函数的使用主要是配合委托和事件进行使用 脱离委托和事件 是不会使用匿名函数的 基本语法 delegate (参数列表) { 函数逻辑 …

【jvm】PC寄存器为什么设定为线程私有?

目录 1. 说明2. 多线程执行的需求3. CPU切换线程的需要4. 并发执行的特性 1. 说明 1.PC寄存器被设定为线程私有主要是为了满足多线程执行的需求、CPU切换线程的需要以及并发执行的特性。2.这种设计保证了每个线程都能独立地执行其任务&#xff0c;并且能够在CPU进行线程切换时…

【Spring Boot】全局异常处理

目录 背景 前言 设计步骤 1.定义异常信息类&#xff1a; 2.自定义异常&#xff1a; 3.创建全局异常处理类 4.在控制器中抛出异常 5.输出 捕获 Valid 校验异常 背景 去面试的时候被问到SpringBoot项目中&#xff0c;如何处理全局异常的&#xff0c;也就是如何捕获全局异…

如何合理设置PostgreSQL的`max_connections`参数

合理设置PostgreSQL的max_connections参数对于数据库的稳定性和性能至关重要。这个设置值决定了允许同时连接到数据库的最大客户端数量。如果设置不当&#xff0c;可能导致资源浪费或系统过载。以下是设置max_connections时需要考虑的几个关键因素&#xff1a; 1. 评估系统硬件…

【python】灰色预测 GM(1,1) 模型

文章目录 前言python代码 前言 用 python 复刻上一篇博客的 Matlab 代码。 【学习笔记】灰色预测 GM(1,1) 模型 —— Matlab python代码 # %% import numpy as np import statsmodels.api as sm import matplotlib.pyplot as plt from matplotlib.pylab import mplmpl.rcPa…

pikachu SSRF通关(服务器端请求伪造)

开始闯关吧 一共有两关 第1关 SSRF(curl) 按照指示点击下图蓝色字体的链接 得到了下图地址栏里的带参数的url&#xff0c;参数名是url&#xff0c; PHP的curl PHP支持的由Daniel Stenberg创建的libcurl库允许你与各种的服务器使用各种类型的协议进行连接和通讯。 libcurl目前…

趣味算法------试用 6 和 9 组成的最大数字

目录 ​编辑 题目描述 解题思路 具体代码 总结 题目描述 给你一个仅由数字 6 和 9 组成的正整数 num。 你最多只能翻转一位数字&#xff0c;将 6 变成 9&#xff0c;或者把 9 变成 6 。 请返回你可以得到的最大数字。 输入格式 一个整数 输出格式 一个整数 输入输出…

java日常管理

JRE、JDK和JVM简述 GC 什么是GC GC&#xff08;Garbage Collection&#xff09;内存自动管理极速&#xff1a;内存垃圾自动回收技术[内存的分配和释放] 使用GC的好处 提高了软件开发的抽象度&#xff1b;程序员可以将精力集中在实际的问题上而不用分心来管理内存的问题&am…

Linux数据相关第1个服务_备份服务rsync

1、备份服务概述 备份服务&#xff1a;需要使用到脚本&#xff0c;打包备份&#xff0c;定时任务 备份服务&#xff1a;rsyncd 服务&#xff0c;不同主机之间数据传输 特点: rsync是个服务也是命令使用方便&#xff0c;具有多种模式传输数据的时候是增量传输 增量与全量&am…

周报 | 24.8.19-24.8.25文章汇总

为了更好地整理文章和发表接下来的文章&#xff0c;以后每周都汇总一份周报。 周报 | 24.8.12-24.8.18文章汇总-CSDN博客 新智元 | 微调Flux席卷全网&#xff0c;外国小哥一人组一队漫威英雄&#xff01;_flux 怎么微调-CSDN博客 新智元 | 百万在线&#xff0c;大圣归来&…

[ 全部搞定 - 发票导出表格 ] PDF发票提取到表,图片发票提取到表格,扫描件发票提取到表格,全电发票PDF,全电发票扫描件识别导出EXCEL表格

最近很多朋友说找PDF发票提取Excel表格的&#xff0c;找到了图片识别Excel表格的&#xff0c;有的找图片识别Excel表格的&#xff0c;找到了PDF发票提取表格的&#xff0c;所以就很难搞&#xff0c;还有的说都想要 今天一篇文章&#xff0c;全部搞定所有发票【电子发票&#x…

Solon2 接口开发:实战 Gateway 模式效果

在软件开发中&#xff0c;特别是使用 Solon 框架进行接口开发时&#xff0c;采用 Gateway 模式可以有效地管理 API 路由、认证、限流等。Solon 是一个轻量级的 Java 微服务框架&#xff0c;它支持多种开发模式&#xff0c;包括 Web、RESTful API、Socket 等。这里&#xff0c;我…

一文了解 Vue3 的 nextTick 大致信息

nextTick 是 Vue 3 中用于完成数据绑定和 DOM 更新后执行的方法&#xff0c;非常有用&#xff0c;也是 Vue 的一道比较常见的面试题。 1. 基本用法 nextTick 是一个异步方法&#xff0c;它允许我们在下一个 DOM 更新后执行回调函数。当更改了响应式数据并需要在更新后的 DOM …