vue2+vant2+Laravel7 实现多图上传到七牛云

后端接口

1、路由,在 routes/api.php

Route::resource('photos', 'PhotoController')->only('store');

2、创建对应控制器

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;class PhotoController extends Controller
{/**** 上传图片* @param Request $request*/public function store(Request $request){if ($request->hasFile('file') && $request->file('file')->isValid()) {$path = $request->file->store('public/images');//上传到七牛云$file_path = storage_path('app/') . $path;qiniu_upload($file_path);return response()->json( 'https://image.xxx.com/' . basename($file_path));}}
}

3、定义辅助函数 qiniu.php

<?php
// 引入鉴权类
use Qiniu\Auth;
// 引入上传类
use Qiniu\Storage\UploadManager;function qiniu_upload($filePath)
{$accessKey = "fAoxxxxxxxxxxxxxxxxxxxxxxxxx";$secretKey = "dkCxxxxxxxxxxxxxxxxxxxxxxxxx";$bucket = "xxxxx";$auth = new Auth($accessKey, $secretKey);$token = $auth->uploadToken($bucket);// 上传到七牛后保存的文件名$key = basename($filePath);// 初始化 UploadManager 对象并进行文件的上传。$uploadMgr = new UploadManager();// 调用 UploadManager 的 putFile 方法进行文件的上传。$uploadMgr->putFile($token, $key, $filePath);unlink($filePath);
}

这里需要安装七牛云的包,不会用的可以看七牛官网或在评论区给我留言。

前端

1、创建 vue2 项目,此步骤省略,自行完成。
2、安装 axiosvue2-toastVant2 前端 UI 框架,

npm install axiosnpm install toast2-vue -Snpm i vant@latest-v2 -S

3、在 main.js 中,全部代码如下,供参考:

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import Vant from 'vant'
import 'vant/lib/index.css'
import axios from 'axios'
import 'vue2-toast/lib/toast.css'
import Toast from 'vue2-toast'axios.defaults.baseURL = 'https://xxx.xxx.com/'
Vue.prototype.$http = axios
Vue.use(Toast)
Vue.use(Vant)
Vue.config.productionTip = falsenew Vue({router,render: h => h(App)
}).$mount('#app')

4、在 src/router/index.js 中添加路由,代码如下:

import Vue from 'vue'
import VueRouter from 'vue-router'Vue.use(VueRouter)const routes = [{path: '/',name: 'Home',component: () => import('../views/Home.vue')}
]const router = new VueRouter({routes
})export default router

5、准备视图,在 src/views/Home.vue 中,全部代码如下:

<template><div class="home"><h2 class="van-doc-title" style="text-align: center">督查记录表</h2><van-form @submit="onSubmit"><h2 class="van-doc-demo-block__title" style="background-color: #f7f8fa;">基础信息</h2><van-fieldv-model="form.name"label="督查员:"placeholder="请输入姓名":rules="[{ required: true, message: '请填写姓名' }]"/><van-fieldreadonlyclickablename="picker":value="form.department"label="督查场部:"placeholder="点击选择"@click="showPicker = true"/><van-popup v-model="showPicker" position="bottom"><van-pickershow-toolbar:columns="stages"@confirm="onConfirm"@cancel="showPicker = false"/></van-popup><van-fieldv-model="form.address"label="督查地点:"placeholder="请输入地点名称":rules="[{ required: true, message: '请填写地点名称' }]"/><van-fieldv-model="form.head"label="岗位负责人:"placeholder="请输入负责人姓名":rules="[{ required: true, message: '请填写负责人姓名' }]"/><h2 class="van-doc-demo-block__title" style="background-color: #f7f8fa;">检查项目</h2><van-field name="radio" label="卫生情况:"><template #input><van-radio-group v-model="form.health" direction="horizontal"><van-radio name="1">合格</van-radio><van-radio name="0">不合格</van-radio></van-radio-group></template></van-field><van-field name="uploader" label="附图:"><template #input><van-uploader v-model="form.imageList" multiple :max-count="2":after-read="afterRead"/></template></van-field><van-fieldv-model="form.message"rows="2"autosizelabel="留言:"type="textarea"maxlength="50"placeholder="请输入留言"show-word-limit/><div style="display: flex;align-items: center;"><h2 class="van-doc-demo-block__title"style="font-size: 14px;color: #646566;font-weight: normal;padding-right: 15px">评分:</h2><van-ratev-model="form.rate":size="25"color="#ffd21e"void-icon="star"void-color="#eee"count="10"@change="onChange"/></div><div style="margin: 50px 16px 16px 16px;"><van-button round block type="info" native-type="submit">提交</van-button></div></van-form></div>
</template><script>
/* eslint-disable */
export default {data () {return {stages: ['总部', '杨湖场', '株山场', '天子山场', '品格饲料厂'],showPicker: false,form: {name: '',department: '',address: '',head: '',health: '1',imageList: [],message: '',rate: 0}}},methods: {// 选择框onConfirm (value) {this.form.department = valuethis.showPicker = false},// 点击评分onChange (value) {this.form.rate = value},// 点击上传afterRead (file) {file.status = 'uploading'file.message = '上传中...'const formData = new FormData()formData.append('file', file.file)this.uploadImage(formData).then(response => {// 假设返回的response.data是图片的URLfile.content = response.datafile.status = 'done'file.message = '上传成功'this.form.imageList = [...this.form.imageList] // 通过替换imageList数组的内容来更新视图})},// 图片上传至后端服务器uploadImage (formData) {const uploadUrl = 'https://xxx.xxx.com/api/photos'return this.$http.post(uploadUrl, formData, {headers: {'Content-Type': 'multipart/form-data'}})},// 表单提交async onSubmit () {const res = await this.$http.post('api/check', this.form)if (res.data.status === true) {this.$toast.center(res.data.message)this.form = {}this.form.health = '1'}}}
}
</script><style>
.van-doc-demo-block__title {padding: 10px 16px;color: rgba(69, 90, 100, 0.6);font-weight: normal;font-size: 14px;line-height: 16px;
}.van-cell {padding: 15px 16px;
}.van-button--info {background-color: #f4645f;border: 1px solid #f4645f;
}.van-radio__icon--checked .van-icon {background-color: #f4645f;border-color: #f4645f;
}
</style>

上述代码其实是实现一个 form 表单的提交,里面有个比较重要的功能,就是多图上传的问题。最终的效果如下图:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2871428.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

网络安全行业真的很内卷吗?

有一个特别流行的词语叫做“内卷”&#xff1a; 城市内卷太严重了&#xff0c;年轻人不好找工作&#xff1b;教育内卷&#xff1b;考研内卷&#xff1b;当然还有计算机行业内卷…… 这里的内卷当然不是这个词原本的意思&#xff0c;而是“过剩”“饱和”的替代词。 按照网络安…

【GPT-SOVITS-03】SOVITS 模块-生成模型解析

说明&#xff1a;该系列文章从本人知乎账号迁入&#xff0c;主要原因是知乎图片附件过于模糊。 知乎专栏地址&#xff1a; 语音生成专栏 系列文章地址&#xff1a; 【GPT-SOVITS-01】源码梳理 【GPT-SOVITS-02】GPT模块解析 【GPT-SOVITS-03】SOVITS 模块-生成模型解析 【G…

每日五道java面试题之mybatis篇(三)

目录&#xff1a; 第一题. MyBatis的框架架构设计是怎么样的?第二题. 为什么需要预编译?第三题. Mybatis都有哪些Executor执行器&#xff1f;它们之间的区别是什么&#xff1f;第四题. Mybatis中如何指定使用哪一种Executor执行器&#xff1f;第五题. Mybatis是否支持延迟加载…

龙芯新世界系统(安同AOCS OS)安装Cinnamon桌面最新版6.0.4

龙芯的新世界系统安同AOCS OS是十分优秀的操作系统&#xff0c;处于纯社区方式运行&#xff0c;她的各组件更新得很及时&#xff0c;很多组件都处于最新的状态&#xff0c;给我们安装使用最新的开源软件提供了很好的基础。由于本人一直使用Cinnamon桌面环境&#xff0c;各方面都…

鸿蒙开发实战:【Faultloggerd部件】

theme: z-blue 简介 Faultloggerd部件是OpenHarmony中C/C运行时崩溃临时日志的生成及管理模块。面向基于 Rust 开发的部件&#xff0c;Faultloggerd 提供了Rust Panic故障日志生成能力。系统开发者可以在预设的路径下找到故障日志&#xff0c;定位相关问题。 架构 Native In…

【Linux】对进程PCB的理解查看进程信息的方法

一、学习准备&#xff1a;对操作系统工作模式的理解 首先我们要清楚的是&#xff0c;操作系统是一个进行软硬件资源管理的软件。操作系统对下要管理好底层硬件。每一个硬件的生产产商都会给他们的产品提供对应的驱动程序&#xff0c;驱动程序是特定于某一硬件或系统设备的软件组…

【CTF web1】

CTF web 一、CTF web -PHP弱类型1、是否相等&#xff1f;2、转换规则: 二、CTF web -md5绕过1、若类型比较绕过2、null绕过3、碰撞绕过 三、习题 一、CTF web -PHP弱类型 1、是否相等&#xff1f; &#xff1a;在进行比较的时候&#xff0c;会先判断两种字符串的类型是否相等&…

Flink程序员开发利器本地化WebUI生成

前言 在flink程序开发或者调试过程中&#xff0c;每次部署到集群上都需要不断打包部署&#xff0c;其实是比较麻烦的事情&#xff0c;其实flink一直就提供了一种比较好的方式使得开发同学不用部署就可以观察到flink执行情况。 上代码 第一步&#xff1a;开发之前需要引入在本…

快速获取网页所有图片/获取网页电子资源内的图片

有时候看一些电子资源/电子教案过程中&#xff0c; 想把这些图下载下来&#xff0c;但是不能一个个截图 在之前的文章介绍了使用IDM软件下载所有的图片的方式&#xff0c;这种方式需要获取一个图片的地址并迭代 但是今天又发现了一种更快捷方式&#xff0c;是在浏览器控制台…

粤嵌6818嵌入式开发入门教程

学习目标 1.了解嵌入式开发 2.开发环境的搭建 3.Linux操作系统的基本操作 一、了解嵌入式开发 以应用为中心&#xff0c;以计算机技术为基础&#xff0c;软硬件可裁剪&#xff0c;适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。 1.嵌入式可以干…

SpringTask实现的任务调度与XXL-job实现的分布式任务调度【XXL-Job工作原理】

目录 任务调度 分布式任务调度 分布式任务调度存在的问题以及解决方案 使用SpringTask实现单体服务的任务调度 XXL-job分布式任务调度系统工作原理 XXL-job系统组成 XXL-job工作原理 使用XXL-job实现分布式任务调度 配置调度中心XXL-job 登录调度中心创建执行器和任务 …

C++——类和对象(3)

目录 1. 拷贝构造 1.1 概念 1.2 特性 ​编辑 2. 赋值重载 和 运算符重载 2.1 运算符重载 2.2 赋值重载 此篇文章讲解六个默认成员函数中的 拷贝构造和赋值重载 。 1. 拷贝构造 1.1 概念 拷贝构造&#xff1a; 在创建对象的时候用已经创建好的对象去初始化一个新对象&am…

解决分布式事务,Seata真香!

年IT寒冬&#xff0c;大厂都裁员或者准备裁员&#xff0c;作为开猿节流主要目标之一&#xff0c;我们更应该时刻保持竞争力。为了抱团取暖&#xff0c;林老师开通了《知识星球》&#xff0c;并邀请我阿里、快手、腾讯等的朋友加入&#xff0c;分享八股文、项目经验、管理经验等…

Java八股文(MyBatis Plus)

Java八股文のMyBatis Plus MyBatis Plus MyBatis Plus MyBatis Plus 是什么&#xff1f;它与 MyBatis 有什么区别&#xff1f; MyBatis Plus 是基于 MyBatis 进行扩展的一款持久层框架&#xff0c;它提供了一系列增强功能&#xff0c;简化了 MyBatis 的使用。 与 MyBatis 相比…

zookeeper快速入门四:在java客户端中操作zookeeper

系列文章&#xff1a; zookeeper快速入门一&#xff1a;zookeeper安装与启动-CSDN博客 zookeeper快速入门二&#xff1a;zookeeper基本概念-CSDN博客 zookeeper快速入门三&#xff1a;zookeeper的基本操作 先启动zookeeper服务端。 在maven引入zookeeper依赖。 <depende…

Acwing-基础算法课笔记之动态规划(计数类DP)

Acwing-基础算法课笔记之动态规划&#xff08;计数类DP&#xff09; 一、整数划分1、定义2、完全背包的做法代码示例&#xff08;1&#xff09;过程模拟&#xff08;2&#xff09;代码示例 3、计数类DP的做法&#xff08;1&#xff09;过程模拟&#xff08;2&#xff09;闫氏DP…

疑难杂症!handleSubmit does not execute onSubmit function

背景 今天在写Nextjs代码的时候&#xff0c;发现一个问题&#xff0c;我使用react-use-form的表单&#xff0c;点击提交按钮的时候&#xff1a;onSubmit没有被触发&#xff01;&#xff01; 于是排查 源代码如下&#xff1a; "use client"import { AddLinkReques…

ros小问题之差速轮式机器人轮子不显示(rviz gazebo)

在rviz及gazebo练习差速轮式机器人时&#xff0c;很奇怪&#xff0c;只有个机器人的底板及底部的两个万向轮&#xff0c;如下图&#xff0c; 后来查看相关.xacro文件&#xff0c;里面是引用包含了轮子的xacro文件&#xff0c;只需传入不同的参数即可调用生成不同位置的轮子&…

数据结构——lesson8二叉树的实现

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

如何使用人工智能打造超用户预期的个性化购物体验

回看我的营销职业生涯&#xff0c;我见证了数字时代如何重塑客户期望。从一刀切的方法过渡到创造高度个性化的购物体验已成为企业的关键。在这个客户期望不断变化的新时代&#xff0c;创造个性化的购物体验不再是奢侈品&#xff0c;而是企业的必需品。人工智能 &#xff08;AI&…