当前位置: 首页 > news >正文

【微信小程序】van-uploader实现文件上传

使用van-uploader和wx.uploadFile实现文件上传,后端使用ThinkPHP。

1、前端代码
json:引入van-uploader

{"usingComponents": {"van-uploader": "@vant/weapp/uploader/index"}
}

wxml:deletedFile是删除文件函数,设置deletable=“{{ true }}” 和在数据中 deletable: true图片右上角会显示删除按钮,在点击删除图标时调用deletedFile函数去处理删除逻辑。beforeRead:是读之前调用函数,afterRead读取文件之后调用的文件。

<!--pages/addFile/addFile.wxml-->
<view style="display: flex;"><van-uploader file-list="{{ fileList }}" max-count="1" deletable="{{ true }}" bind:delete="deletedFile" bind:before-read="beforeRead" bind:after-read="afterRead" accept="image" />
</view><view class="btn-area" style="margin-top: 400rpx;"><button style="margin: 30rpx 0" type="primary" bindtap="submit">提交</button>
</view>

js:

// pages/addFile/addFile.js
var http = require("../../utils/http.js");var config = require("../../utils/config.js");
Page({/*** 页面的初始数据*/data: {fileList: [],fileUrl: "",show: false,sysFileId: null},/*** 生命周期函数--监听页面加载*/onLoad(options) {},/*** 生命周期函数--监听页面初次渲染完成*/onReady() {},/*** 生命周期函数--监听页面显示*/onShow() {},/*** 生命周期函数--监听页面隐藏*/onHide() {},/*** 生命周期函数--监听页面卸载*/onUnload() {},/*** 页面相关事件处理函数--监听用户下拉动作*/onPullDownRefresh() {},/*** 页面上拉触底事件的处理函数*/onReachBottom() {},/*** 用户点击右上角分享*/onShareAppMessage() {},beforeRead(event) {const {file,callback} = event.detail;callback(file.type === 'image');},deletedFile(event){let fileList = [];this.setData({fileList});this.setData({"sysFileId":null})},afterRead(event) {const {file,callback} = event.detail;let that = this;console.log(file);wx.uploadFile({url: config.domain + '/uploadSysFile', //上传文件接口filePath: file.url,name: 'file',formData: {},success(res) {const data = res.data;let dataRuslt = JSON.parse(data);let fileList = [];fileList.push({"url": config.resourcedomain + "/" + dataRuslt.data.fileUrl,"name": dataRuslt.data.fileName,deletable: true,});that.setData({fileList});that.setData({"sysFileId":dataRuslt.data.sysFileId});}})},submit(event) {//点击提交按钮上传设置banner图数据if(!this.data.sysFileId){wx.showToast({title: '请选择图片!',})return;}var params = {url: "/addBanner",method: "POST",data: {"sysFileId": this.data.sysFileId},callBack: function (res) {wx.navigateBack({url: '/pages/admin/admin'})}};http.request(params);},
})

http工具:

var config = require("config.js");
var app = getApp();
//统一的网络请求方法
function request(params, isGetTonken) {// 全局变量var globalData = getApp().globalData;wx.request({url: config.domain + params.url, //接口请求地址data: params.data,header: {'token': params.login ? undefined : wx.getStorageSync('token')},method: params.method == undefined ? "POST" : params.method,dataType: 'json',responseType: params.responseType == undefined ? 'text' : params.responseType,success: function(res) {const responseData = res.data// 200请求成功if (responseData.code == '200') {if (params.callBack) {params.callBack(responseData.data);}return}// 500if (responseData.code == '500') {wx.showToast({title: responseData.msg,icon: 'none'})return}// E1111用于直接显示提示用户的错误,内容由输入内容决定if (responseData.code == 'E1111') {if (params.errCallBack) {params.errCallBack(responseData)return}wx.showToast({title: responseData.msg || 'Error',icon: 'none'})return}if (!globalData.isLanding) {wx.hideLoading();}},fail: function(err) {wx.hideLoading();wx.showToast({title: "服务器出了点小差",icon: "none"});}})
}})
}
exports.request = request;

config.js:

var baseDomain = "http://localhost:8414/";  //统一接口域名,测试环境
var domain = baseDomain+"index.php"; //统一接口域名,测试环境
var resourcedomain = baseDomain; //统一接口域名,测试环境
var version = "2.1.0";
exports.domain = domain;
exports.version = version;
exports.resourcedomain = resourcedomain;

2、ThinkPHP后端上传文件接口

<?phpnamespace app\controller;use app\BaseController;
use think\Request;
use app\common\CosClient;
use app\model\SysFile;
use think\facade\Config;
use app\model\ClassVideoItem;class SysFileController extends BaseController
{/*** 上传文件cos*/public function uploadSysFile(Request $request){$file = $request->file('file');$fileUpload = Config::get("fileUpload");$storeType = $fileUpload["storeType"];$mimeType = $file->getOriginalMime();$fileName = $file->getOriginalName();if ($storeType == 1) {//本地上传$filePath = "storeFile/";$info = $file->move($filePath, $fileName);$filePath = $filePath . $fileName;$storePath = $filePath;$sysFile = new SysFile();$sysFile->file_name = $fileName;$sysFile->file_url = $filePath;$sysFile->file_type = $mimeType;$sysFile->store_type = 1;$sysFile->save();//保存到数据库return $this->success(["fileUrl" => $storePath,"fileName" => $fileName,"sysFileId" => $sysFile->id,"fileType" => $sysFile->store_type]);} else if ($storeType == 2) {//腾讯云存储对象上传文件$filePath = "tempFile/";$info = $file->move($filePath, $fileName);$filePath = $filePath . $fileName;$storePath = $filePath;$sysFile = new SysFile();$cosFileUrl = CosClient::uploadFile($fileName, $filePath);if (!is_null($cosFileUrl)) {$sysFile->file_name = $fileName;$sysFile->file_url = "https://" . $cosFileUrl;$sysFile->file_type = $mimeType;$sysFile->store_type = 2;$sysFile->save();unlink($filePath);//删除文件$storePath = $cosFileUrl;return $this->success(["fileUrl" => $storePath,"fileName" => $fileName,"sysFileId" => $sysFile->id,"fileType" => $sysFile->store_type]);}}return $this->errorMsg("上传失败识别不到上传方式!");}}

cosClint.php

<?phpnamespace app\common;use think\facade\Config;
use Qcloud\Cos\Client;
use app\common\Util;class CosClient
{public static function uploadFile($fileName = "", $srcPath = ""){try {$qcloudConfig = Config::get("cosClient");$configBucket = $qcloudConfig["bucket"];$configKey = "kexuexiong/" . Util::get_random(9) . $fileName;$file = fopen($srcPath, 'rb');$result = null;if ($file) {$result = CosClient::cosClient()->Upload($bucket = $configBucket,$key = $configKey,$body = $file);}return $result["Location"];} catch (\Exception $e) {echo "$e\n";}}public static function cosClient(){$qcloudConfig = Config::get("cosClient");$secretId = $qcloudConfig["secretId"];$secretKey = $qcloudConfig["secretKey"];$region = $qcloudConfig["region"];$cosClient = new Client(array('region' => $region,'schema' => 'https','credentials' => array('secretId'  => $secretId,'secretKey' => $secretKey)));return $cosClient;}
}

配置文件cosClint.php

<?phpreturn  ["secretId" =>"",//替换为用户的 secretId,请登录访问管理控制台进行查看和管理,https://console.cloud.tencent.com/cam/capi"secretKey" => "", //替换为用户的 secretKey,请登录访问管理控制台进行查看和管理,https://console.cloud.tencent.com/cam/capi"region" => "", //替换为用户的 region,已创建桶归属的region可以在控制台查看,https://console.cloud.tencent.com/cos5/bucket"token" => "COS_TMPTOKEN", //如果使用永久密钥不需要填入token,如果使用临时密钥需要填入,临时密钥生成和使用指引参见https://cloud.tencent.com/document/product/436/14048"bucket" => ""
];

配置文件fileUpload.php:

<?phpreturn  ["storeType" => 1,//配置开启的上传方式"domain" => "http://localhost:8414/",
];

效果图:
在这里插入图片描述

相关文章:

【微信小程序】van-uploader实现文件上传

使用van-uploader和wx.uploadFile实现文件上传&#xff0c;后端使用ThinkPHP。 1、前端代码 json&#xff1a;引入van-uploader {"usingComponents": {"van-uploader": "vant/weapp/uploader/index"} }wxml&#xff1a;deletedFile是删除文件函…...

人工智能在计算机视觉中的应用与挑战

引言 计算机视觉是人工智能领域的一个重要分支&#xff0c;旨在让计算机能够像人一样理解和解释视觉信息&#xff0c;实现图像和视频的自动识别、理解和分析。计算机视觉技术已经在许多领域产生了深远的影响&#xff0c;如人脸识别、自动驾驶、医学影像分析等。本篇博客将深入…...

以太网接口指示灯状态分析和电路设计

一、RJ45以太网连接器介绍 以带网络隔离变压器的RJ45接头为例&#xff0c;如HR911105A&#xff0c;其技术参数如下 原理框图 指示灯部分 二、PHY芯片 phy芯片以DP83848CVV/NOPB为例&#xff0c;查看数据手册。引脚26&#xff0c;引脚27和引脚28和LED灯相关&#xff0c;如下截…...

Redis的基础

一、进入redis 内部 / 关闭 # 方式一&#xff1a; // 进入redis redis-cli // 有密码输入密码 &#xff1a;auth [username] password auth 123456 # 方式二&#xff1a; // 进入redis 并且输入密码 redis-cli -a 123456// 如果在docker 里面的则可以 docker exec -it redis…...

LeetCode 626. 换座位

题目链接&#xff1a;LeetCode 626. 换座位 题目描述 表名&#xff1a;Seat 编写SQL查询来交换每两个连续的学生的座位号。如果学生的数量是奇数&#xff0c;则最后一个学生的id不交换。 按 id 升序 返回结果表。 查询结果格式如下所示。 示例1&#xff1a; 题目分析 如…...

华为、阿里巴巴、字节跳动 100+ Python 面试问题总结(六)

系列文章目录 个人简介&#xff1a;机电专业在读研究生&#xff0c;CSDN内容合伙人&#xff0c;博主个人首页 Python面试专栏&#xff1a;《Python面试》此专栏面向准备面试的2024届毕业生。欢迎阅读&#xff0c;一起进步&#xff01;&#x1f31f;&#x1f31f;&#x1f31f; …...

hash 模式和 history 模式的实现原理

hash 模式和 history 模式的实现原理&#xff1a; #后面的 hash 值的变化不会导致浏览器向服务器发出请求&#xff0c;浏览器不发出请求&#xff0c;就不会刷新页面。通过监听 hashchange 事件的变化可以知道 hash 值发生了哪些变化&#xff0c;然后根据 hash 值的变化来实现更…...

并发编程Part 2

1. JMM 问题&#xff1a;请你谈谈你对volatile的理解? volitile 是 Java 虚拟机提供的一种轻量级的同步机制 &#xff0c;三大特性&#xff1a; 保证可见性 不保证原子性 禁止指令重排 线程之间如何通信&#xff1f; 通信是指线程之间以如何来交换信息。一般线程之间的通信…...

springboot异步多线程的实现

1、配置线程池相关参数 package com.xxx.test.config;import lombok.extern.slf4j.Slf4j; import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation…...

测试相关基础概念与常见开发模型

目录 1. 什么是需求 1.1 需求的定义 1.2 为什么有需求?为什么需求对软件测试人员如此重要? 1.3 测试人员眼里的需求(重要) 1.4 如何深入了解需求 2. 测试用例 2.1 什么是测试用例 2.2 为什么有测试用例 3. 什么是BUG 3.1 BUG定义 3.2 如何描述一个BUG 3.3 如何定义bug的级别 …...

MySQL安装详细教程!!!

安装之前&#xff0c;先卸载你之前安装过的数据库程序&#xff0c;否则会造成端口号占用的情况。 1.首先下载MySQL:MySQL :: Download MySQL Community Server(下载路径) 2.下载版本不一样&#xff0c;安装方法略有不同&#xff1b;&#xff08;版本5的安装基本一致&#xff0c…...

前端下载文化部几种方法(excel,zip,html,markdown、图片等等)和导出 zip 压缩包

文章目录 1、location.href2、location.href3、a标签4、请求后端的方式5、文件下载的方式6、Blob和Base647、下载附件方法(excel,zip,html,markdown)8、封装下载函数9、导出 zip 压缩包相关方法(流方式) 总结 1、location.href //get请求 window.location.href url;2、locati…...

铠甲网络面试(部分)

如何用Redis实现分布式锁的&#xff1f;如果设置的超时时间到了&#xff0c;但占有锁的任务还未完成&#xff0c;怎么办&#xff1f;答案&#xff1a;定时任务进行检测与续约&#xff0c;具体参考 本博----《专题三分布式系统》之《第三章 集中式缓存Redis》之 《第三节 Redis底…...

elasticsearch 将时间类型为时间戳保存格式的时间字段格式化返回

dsl查询用法如下&#xff1a; GET /your_index/_search {"_source": {"includes": ["timestamp", // Include the timestamp field in the search results// Other fields you want to include],"excludes": []},"query": …...

淘宝商品列表怎么通过接口形式导出?

淘宝是目前国内最大的电商平台之一&#xff0c;拥有海量的商品资源。但是&#xff0c;有时候我们需要对淘宝商品进行批量操作&#xff0c;比如进行价格比较、数据分析等等。这时候&#xff0c;我们就需要将淘宝商品列表导出。那么&#xff0c;淘宝商品列表怎么导出呢?又可以按…...

TWS真无线蓝牙耳机哪家好?六款口碑好的TWS真无线蓝牙耳机分享

为了帮助大家在这个充满选择的世界中找到最理想的蓝牙耳机&#xff0c;我们特别为您精心挑选了几款备受赞誉的产品&#xff0c;它们在音质、舒适度、功能和性价比等方面都有出色的表现。在本文中&#xff0c;我们将深入探讨这些蓝牙耳机的特点和优势&#xff0c;帮助您更好地了…...

解决Win11右键菜单问题

✅作者简介&#xff1a;大家好&#xff0c;我是Cisyam&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Cisyam-Shark的博客 &#x1f49e;当前专栏&#xff1a; 程序日常 ✨特色专栏&…...

开源元数据管理平台Datahub最新版本0.10.5——安装部署手册(附离线安装包)

大家好&#xff0c;我是独孤风。 开源元数据管理平台Datahub近期得到了飞速的发展。已经更新到了0.10.5的版本&#xff0c;来咨询我的小伙伴也越来越多&#xff0c;特别是安装过程有很多问题。本文经过和群里大伙伴的共同讨论&#xff0c;总结出安装部署Datahub最新版本的部署手…...

归并排序——“数据结构与算法”

各位CSDN的uu们好呀&#xff0c;今天&#xff0c;小雅兰的内容仍然是数据结构与算法专栏的排序呀&#xff0c;下面&#xff0c;让我们进入归并排序的世界吧&#xff01;&#xff01;&#xff01; 归并排序 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种…...

C语言笔试题训练【第一天】

目录 第一题 第二题 第三题 第四题 第五题 大家好&#xff0c;我是纪宁。 从今天开始博主会日更一些经典的C语言笔试题&#xff0c;持续20天左右。题目类型为5道选择题加2道编程题&#xff0c;希望能和大家一起进步。 第一题 1.读程序&#xff0c;下面程序正确的输出是&…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...