【微信小程序】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/",
];

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot项目修改中静态资源,只需刷新页面无需重启项目(附赠—热加载)

初衷 &#x1f4a2;初衷&#x1f4a2; 因为一遍遍修改并重启项目觉得很麻烦&#xff0c;所以刚开始就自己给项目配置了热加载&#xff0c;但奈何代码更新还是慢&#xff0c;还不如我重启一遍项目的速度&#xff0c;所以放弃了自己上网找到的热加载配置。直到我debugger前端代码…

云原生全栈体系(二)

Kubernetes实战入门 第一章 Kubernetes基础概念 一、是什么 我们急需一个大规模容器编排系统kubernetes具有以下特性&#xff1a; 服务发现和负载均衡 Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器&#xff0c;如果进入容器的流量很大&#xff0c;Kubernetes 可以负…

load、unload和pagehide、pageshow

一、load、unload和pagehide、pageshow的主要应用 1&#xff09;load 和 unload 事件监听web页面的进入和离开&#xff0c;一般用于页面的首次加载、刷新和关闭等操作的监听&#xff1b; 2&#xff09;pageshow 和 pagehide 事件多用于监听浏览器的前进和后退等。 二、pagesh…

【雕爷学编程】 MicroPython动手做(38)——控制触摸屏2

MixPY——让爱(AI)触手可及 MixPY布局 主控芯片&#xff1a;K210&#xff08;64位双核带硬件FPU和卷积加速器的 RISC-V CPU&#xff09; 显示屏&#xff1a;LCD_2.8寸 320*240分辨率&#xff0c;支持电阻触摸 摄像头&#xff1a;OV2640&#xff0c;200W像素 扬声器&#…

SQL 语句中 left join 后用 on 还是 where,区别大了!

目录 情况 小结 举例 情况 前天写SQL时本想通过 A left B join on and 后面的条件来使查出的两条记录变成一条&#xff0c;奈何发现还是有两条。 后来发现 join on and 不会过滤结果记录条数&#xff0c;只会根据and后的条件是否显示 B表的记录&#xff0c;A表的记录一定会显…

RT1052的定时器

文章目录 1 通用定时器1.1 定时器框图1.2 实现周期性中断 2 相关寄存器3 定时器配置3.1 时钟使能3.2 初始化GPT1定时器3.2.1 base3.2.2 initConfig3.2.2.1 clockSorce3.2.2.2 divider3.2.2.3 enablexxxxx 3.3 设置 GPT1 比较值3.3.1 base3.3.2 channel3.3.3 value 3.4 设置 GPT…

数据库的分库分表

#!/bin/bash ######################### #File name:db_fen.sh #Version:v1.0 #Email:admintest.com #Created time:2023-07-29 09:18:52 #Description: ########################## MySQL连接信息 db_user"root" db_password"RedHat123" db_cmd"-u${…

LNMP及论坛搭建(第一个访问,单节点)

LNMP&#xff1a;目前成熟的一个企业网站的应用模式之一&#xff0c;指的是一套协同工作的系统和相关软件 能够提供静态页面服务&#xff0c;也可以提供动态web服务&#xff0c;LNMP是缩写 L&#xff1a;指的是Linux操作系统。 N&#xff1a;指的是nginx&#xff0c;nginx提…

操作系统 - 小记 230803

文章目录 计算机的硬件组成程序的存储和执行程序语言的设计和进化存储设备的层次结构操作系统 https://www.bilibili.com/video/BV1Q5411w7z5?p2 计算机的硬件组成 CPU CU&#xff0c;控制单元ALU&#xff0c;算数逻辑单元寄存器 IO Bridge 处理器和外部交互的桥梁Main Memory…

Java并发编程之顺序一致性

如果程序是正确同步的&#xff0c;程序的执行将具有顺序一致性&#xff08;Sequentially Consistent&#xff09;——即程序的执行结果与该程序在顺序一致性内存模型中的执行结果相同。 同步&#xff0c;即排队。 同一时刻&#xff0c;只能有一个线程和内存交互&#xff01;&a…

windows环境下安装elasticsearch、kibana

通过本文可以快速在windows系统上安装elasticsearch、kibana环境。 当你用Integer类型的时候&#xff0c;要非常小心&#xff0c;因为100等于100、但是200不等于200&#xff0c;当然&#xff0c;如果你会一点小花招&#xff0c;也可以让100不等于100、让200等于200。(运算符比较…

windows物理机 上安装centos ,ubuntu,等多个操作系统的要点

一、摘要 一般情况下&#xff0c;我们的笔记本或工作电脑都默认安装windows 分几个区&#xff0c;当下是win7 win8 win 10 win11 等&#xff0c;突然我们有需求需要安装个centos &#xff0c;后面我们应当怎么做&#xff0c;要点是什么&#xff1f;一定要根据网上的贴子一步步来…

状态模式(State)

状态模式是一种行为设计模式&#xff0c;允许一个对象在其内部状态改变时改变它的行为&#xff0c;使其看起来修改了自身所属的类。其别名为状态对象(Objects for States)。 State is a behavior design pattern that allows an object to change its behavior when its inter…

【LeetCode】地下城游戏(动态规划)

地下城游戏 题目描述算法分析编程代码 链接: 地下城游戏 题目描述 算法分析 编程代码 class Solution { public:int calculateMinimumHP(vector<vector<int>>& dungeon) {int m dungeon.size();int n dungeon[0].size();vector<vector<int>> d…

异或运算详解

异或运算详解 定义特性用途总结 定义 参与运算的两个数据,按二进制位进行 ^ 运算,如果两个相对应为值相同结果为0,否则为1 1 ^ 0 1 0 ^ 1 1 0 ^ 0 0 1 ^ 1 0特性 异或^运算只能用于数值(整数) x ^ 0 x x ^ x 0用途 两个值交换,而不用使用临时变量 a a ^ b; b b ^…

《向量数据库》——怎么安装向量检索库Faiss?

装 Faiss 以下教程将展示如何在 Linux 系统上安装 Faiss: 1. 安装 Conda。 在安装 Faiss 之前,先在系统上安装 Conda。Conda 是一个开源软件包和环境管理系统,可在 Windows、macOS 和 Linux 操作系统上运行。根据以下步骤在 Linux 系统上安装 Conda。 2. 从官网…

AI Chat 设计模式:11. 状态模式

本文是该系列的第十一篇&#xff0c;采用问答式的方式展开&#xff0c;问题由我提出&#xff0c;答案由 Chat AI 作出&#xff0c;灰色背景的文字则主要是我的一些思考和补充。 问题列表 Q.1 你知道状态模式吗A.1Q.2 它与有限状态机有什么联系吗&#xff1f;A.2Q.3 知道了&…

安防监控国标GB28181平台EasyGBS可以获取录像却无法播放是什么原因?

安防监控EasyGBS国标视频云服务平台基于国标GB/T28181协议&#xff0c;可实现的视频功能包括&#xff1a;视频直播、录像、语音对讲、云存储、告警、级联等&#xff0c;可分发的视频流包括RTSP、RTMP、FLV、HLS等格式。 近期有用户反馈&#xff0c;安防监控EasyGBS出现了设备录…

linux网卡命名规则

Consistent Network Device Naming Linux provides methods for consistent(一致) and predictable(可预测) network device naming for network interfaces. These features change the name of network interfaces on a system in order to make locating and different…

CentOS系统启动过程

CentOS系统启动流程图 &#xff08;1&#xff09; 加载 BIOS 计算机电源加电质检&#xff0c;首先加载基本输入输出系统&#xff08;Basic Input Output System&#xff0c;BIOS&#xff09;&#xff0c;BIOS 中包含硬件 CPU、内存、硬盘等相关信息&#xff0c;包含设备启动顺序…