uniapp调用七牛云api实现文件上传-node.js向外提供uploadToken的接口-客户端不用下载七牛云的包和SDK-发起网络请求直接上传

news2024/12/22 14:30:33

uniapp调用七牛云api实现文件上传

实现思路:
1.使用node.js向客户端提供uploadToken,客户端获取uploadToken后使用七牛云的api接口发起网络请求,上传文件;
node.js向外提供uploadToken的接口-客户端不用下载七牛云的包和SDK-,拿到uploadToken发起网络请求直接上传文件即可.
2.在本地,直接node.js运行实现的上传.

一、在unicloud云函数实现node.js获取uploadToken,然后向外提供一个接口
1.新建云函数:
在这里插入图片描述
2.首先,需要安装qiniu模块。 在终端上输入以下命令进行安装:

npm install qiniu

2.按照官方文档获取 Access Key、Secret Key 和存储空间名称(Bucket)。
在使用七牛云服务之前,你需要登录去七牛云平台开通账号,申请 Access Key、Secret Key,以及创建一个 Bucket。

const qiniu = require('qiniu');

qiniu.conf.ACCESS_KEY = 'Your_Access_Key';
qiniu.conf.SECRET_KEY = 'Your_Secret_Key';

3.创建上传凭证。
Qiniu 中的上传 Token 是在客户端生成,在客户端直接调用 API 上传文件时需要携带该 Token。可以通过七牛云提供的 SDK 自动生成上传凭证。下面是基本的生成方式

const bucket = 'Your_Bucket_Name';
const key = 'Your_File_Name';
const putPolicy = new qiniu.rs.PutPolicy({ scope: `${bucket}:${key}` });

// uploadToken 就是我们需要的token:uploadToken 
const uploadToken = putPolicy.uploadToken();

云函数的完整代码如下:

// 示例代码
'use strict';
const qiniu = require('qiniu');
var accessKey = 'Your_Bucket_Name'; // 这里换成自己的accessKey -在七牛云后台有,直接复制过来
var secretKey = 'Your_File_Name'; // 这里换成自己的secretKey -在七牛云后台有,直接复制过来
var mac = new qiniu.auth.digest.Mac(accessKey, secretKey);
var options = {
	scope: 'xingyue-yuelao', // 必填, 七牛云控制台添加的空间名称
	// expires: 7200,  // expires非必填, 在不指定上传凭证的有效时间情况下,默认有效期为1个小时。expires单位为秒
	returnBody: '{"key":"$(key)","hash":"$(etag)","fsize":$(fsize),"bucket":"$(bucket)","name":"$(x:name)"}'
	// returnBody非必填, 有时候我们希望能自定义这个返回的JSON格式的内容,可以通过设置returnBody参数来实现。
};
var putPolicy = new qiniu.rs.PutPolicy(options); // 配置
var uploadToken = putPolicy.uploadToken(mac); // 获取上传凭证:uploadToken 
// 到这里就成功拿到uploadToken 了,云函数提供一个接口,把这个token返回出去,客户端调用接口获取。
// 当然,为了安全考虑的话,获取这个token最好做安全控制,比如在这里做账号密码验证,调接口的时候传账号密码来,验证通过再返回token,这里就不做演示了。

// 下面是往外提供接口
exports.main = async (event, context) => {
	/**
	 * 调用method:POST
	 * 无需参数,调用即可获取token,token1小时过期
	 */
	return {
		message: '获取token成功',
		status: 'SUCCESS',
		uploadToken: uploadToken,
	}
};

然后把云函数上传部署后做云函数url化,这样就可以在任意地方调用啦:

在这里插入图片描述

做完上面的步骤后,就可以在uniapp调用接口获取token了:

// 发起请求,获取上传文件需要的uploadToken
				uni.request({
				   // url就是上面提供的那个云函数url化后的地址 
					url: 'https://fc-mp*******next.bspapp.com/getuploadToken',
					method: 'POST',
					// data: {},
					success: (res) => {
					 // res.data.uploadToken; 就是uploadToken咯
					}
				})

下面可以在客户端发起网络请求上传文件了:

//选择图片
			chooseImage() {
				uni.chooseImage({
					count: this.rduLength < this.count ? this.rduLength : this.count, //最多可以选择的图片张数,默认9
					sizeType: ['original', 'compressed'], //original 原图,compressed 压缩图,默认二者都有
					sourceType: ['album', 'camera'], //album 从相册选图,camera 使用相机,默认二者都有
					success: res => {
						this.useQiniiyun_upload(res.tempFilePaths); // 这个是调用七牛云上传
					}
				});
			}, 
           // files 是文件列表[],多个文件临时地址
			useQiniiyun_upload(files) {
				// console.log('图片列表files:', files)
				uni.showLoading({
					title: '图片上传中..',
				})
				/**
				 * 参数:
				 * 1.file:要上传的文件选择器或者文件对象
				 *2. filename_qn:上传到七牛后保存的文件名。如果不指定,则由七牛服务器自动生成。
				 *3. token:上传凭证,详见 上传策略
				 */
				// 上传以后的文件名-存在七牛云的文件名字-空间的域名+文件名就可以访问文件了!最好做时间戳+随机数这样做一个唯一的文件名字
				const filename_qn = 'unicloud_' + new Date().getTime() + ('000000' + Math.floor(Math.random() * 999999)).slice(-6) + '.png';
				// console.log('上传前生成的文件名字:', filename_qn)
				// 发起请求,获取上传文件需要的uploadToken
				uni.request({
					url: 'https://*********.next.bspapp.com/getuploadToken',
					method: 'POST',
					// data: {},
					success: (res) => {
						const token = res.data.uploadToken;
						// 获取成功后发起文件上传
						/**
						 * url:我这里是(https://upload-z2.qiniup.com):华南-广东 对应的七牛云的地址-其他的可以自行百度
						 * filePath:文件本地临时地址,一次只能一个,字符串类型
						 */
						uni.uploadFile({
							url: 'https://upload-z2.qiniup.com',
							filePath: files[0],
							name: 'file',
							formData: {
								'key': filename_qn, // 存到七牛云后的文件名字,访问图片会用到
								'token': token, // uploadToken,需要动态获取,调用云函数接口获取
							},
							// 存成功后的回调
							success: (uploadFileRes) => {
								let key = JSON.parse(uploadFileRes.data).key;
								// 空间绑定的域名(在七牛云配置)+key就是文件的访问地址
								const img_url = 'https://yuelao.yhxweb.top/' + key
								// this.$util.msg('图片上传成功了');
								uni.hideLoading();
								// 删除数组的第一项地址,再调用,直到上传完所有文件
								files.shift();
								if (files.length > 0) {
									this.useQiniiyun_upload(files);
								}
							},
							fail: (err) => {
								console.log('上传失败了', err);
								uni.hideLoading();
							}
						});
					}
				})
			},

实现演示,上传成功啦:
在这里插入图片描述
去七牛云看看,没问题了:
在这里插入图片描述

下面是在本地测试时候,直接node.js运行实现的上传,全部代码如下:

文件结构:
在这里插入图片描述
npm安装七牛云包,在最上面有.
全部代码:

'use strict';
const qiniu = require('qiniu');
var accessKey = 'RI*********ycN9';// Your_Bucket_Name
var secretKey = 'LVU***********zQNU4P9'; // Your_File_Name
var mac = new qiniu.auth.digest.Mac(accessKey, secretKey);
var options = {
	scope: 'xingyue-yuelao', // 必填, 七牛云控制台添加的空间名称
	// expires: 7200,  // expires非必填, 在不指定上传凭证的有效时间情况下,默认有效期为1个小时。expires单位为秒
	returnBody: '{"key":"$(key)","hash":"$(etag)","fsize":$(fsize),"bucket":"$(bucket)","name":"$(x:name)"}'
	// returnBody非必填, 有时候我们希望能自定义这个返回的JSON格式的内容,可以通过设置returnBody参数来实现。
};
var putPolicy = new qiniu.rs.PutPolicy(options); // 配置
var uploadToken = putPolicy.uploadToken(mac); // 获取上传凭证
var config = new qiniu.conf.Config();
// 空间对应的机房
config.zone = qiniu.zone.Zone_z2;
// 是否使用https域名
config.useHttpsDomain = true;
// 上传是否使用cdn加速
config.useCdnDomain = true;
var formUploader = new qiniu.form_up.FormUploader(config);

// formUploader.putFile方法上传文件
// 第一个属性为上传凭证
// 第二个属性为上传文件要以什么命名  null 则随机命名
// 第三个为文件的相对地址, 相对为当前执行文件的地址
// 第四个属性putExtra, 应该是额外需要的参数,用new qiniu.form_up.PutExtra()获取
// 第五个为回调函数,respErr失败内容  respBody主体内容  respInfo信息内容
var putExtra = new qiniu.form_up.PutExtra();

// 上传以后的文件名
const filename = 'node' + new Date().getTime() + ('000000' + Math.floor(Math.random() * 999999)).slice(-6) + '.png';

// 文件根路径的地址-文件空间绑定的域名
const BaseUrl = 'https://yuelao.yhxweb.top/';

// 上传成功后的返回值
let resdata = null;

formUploader.putFile(uploadToken, filename, './img/1.png', putExtra, function (respErr, respBody, respInfo) {
   if (respErr) {
     	throw respErr;
   }
   if (respInfo.statusCode == 200) {
     	// 如果成功,这里内容便是 图片信息
			 resdata = {
				url: BaseUrl + respBody.key,
				fsize: respBody.fsize,
			 }
		console.log('上传成功啦!',resdata);
   } else {
     	console.log(respInfo.statusCode);
     	console.log(respBody);
		console.log('出错了', respBody)
   }
});
console.log('上传成功啦!',resdata);

运行后:在这里插入图片描述
可以看到上传成功啦:
在这里插入图片描述

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

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

相关文章

macOS电脑

UNIX操作系统有一个规范&#xff0c;名叫《单一UNIX规范》&#xff08;Single UNIX Specification&#xff09;。凡是符合这个规范的操作系统都可以叫UNIX操作系统&#xff0c;并且可以通过UNIX官方认证。 UNIX商标认证官网是&#xff1a;The Register of UNIX Certified Prod…

flink动态表的概念详解

目录 前言&#x1f6a9; 动态表和持续不断查询 stream转化成表 连续查询 查询限制 表转化为流 前言&#x1f6a9; 传统的数据库SQL和实时SQL处理的差别还是很大的&#xff0c;这里简单列出一些区别&#xff1a; 尽管存在这些差异&#xff0c;但使用关系查询和SQL处理流并…

界面控件Telerik UI for WinForms使用指南 - 数据绑定 填充(一)

Telerik UI for WinForms拥有适用Windows Forms的110多个令人惊叹的UI控件&#xff0c;所有的UI for WinForms控件都具有完整的主题支持&#xff0c;可以轻松地帮助开发人员在桌面和平板电脑应用程序提供一致美观的下一代用户体验。 Telerik UI for WinForms组件为可视化任何类…

RoBERTa 阅读笔记

RoBERTa 阅读笔记 https://arxiv.org/abs/1907.11692 总的来说&#xff0c;bert在模型上并没有做太多的改进&#xff0c;只是在训练数据和训练策略上进行了一个改进。 相较于BERT的改进 1. Masking策略 stastic: 原始 BERT 的 masking 是固定的&#xff0c;RoBERTa 给相同的…

ChatGPT: 智能对话时代的未来展望与应用实践

ChatGPT: 智能对话时代的未来展望与应用实践 简介 ChatGPT 是一种基于深度学习和自然语言处理技术的人工智能对话模型。它可以通过生成自然语言文本的方式&#xff0c;与用户进行交互式的对话。作为一种先进的对话生成模型&#xff0c;ChatGPT 在近年来快速发展的人工智能领域中…

首次发刊!Coremail管理员社区2023年Q1季刊发布

4月21日&#xff0c;Coremail安全邮件城市沙龙在北京正式开展&#xff0c;此次沙龙活动的主题为“践行教育信创&#xff0c;护航邮件安全”。广东盈世计算机科技有限公司服务副总裁、ICANN UA大使吴秀诚在活动上正式发布《Coremail管理员社区2023年Q1季刊》。 Coremail管理员社…

公网远程访问公司内网象过河ERP系统「内网穿透」

文章目录 概述1.查看象过河服务端端口2.内网穿透3. 异地公网连接4. 固定公网地址4.1 保留一个固定TCP地址4.2 配置固定TCP地址 5. 使用固定地址连接 概述 ERP系统对于企业来说重要性不言而喻&#xff0c;不管是财务、生产、销售还是采购&#xff0c;都需要用到ERP系统来协助。…

基于spring+vue开发的音乐网站

摘要 随着科学技术的飞速发展&#xff0c;社会的各个领域都在努力与现代的先进技术接轨&#xff0c;以提高自身的优势。音乐推荐管理也不能排除在外。音乐推荐管理是一个管理系统&#xff0c;以实际运用为开发背景&#xff0c;采用JSP技术构建&#xff0c;使用软件工程开发方法…

《面试1v1》java注解

我是 javapub&#xff0c;一名 Markdown 程序员从&#x1f468;‍&#x1f4bb;&#xff0c;八股文种子选手。 面试官&#xff1a;接下来&#xff0c;聊聊Java的注解,它们到底有什么用? 候选人&#xff1a; 注解的用处主要三个: 第一个,编译期使用。比如Override确保你正确重…

activeMQ持久化报错的问题

activeMQ持久化&#xff0c;启动activeMQ报错&#xff0c; INFO | Using Persistence Adapter: JDBCPersistenceAdapter(org.apache.commons.dbcp2.BasicDataSource5148e82a) jvm 1 | WARN | Could not get JDBC connection: Cannot create PoolableConnectionFactory (Commun…

matlab点云的可视化-源码复制粘贴即可(一)

一、导入并可视化一个无属性的点云 clc; clear; close; % clear everything% Import a point cloud from a plain text file (run type(Lion.xyz) to see the contents of the file) pc pointCloud(Lion.xyz);% Generate a z-colored view of the point cloud pc.plot;% Set …

加密解密软件VMProtect入门使用教程(二):分析、破解和保护软件

VMProtect是新一代软件保护实用程序。VMProtect支持德尔菲、Borland C Builder、Visual C/C、Visual Basic&#xff08;本机&#xff09;、Virtual Pascal和XCode编译器。 同时&#xff0c;VMProtect有一个内置的反汇编程序&#xff0c;可以与Windows和Mac OS X可执行文件一起…

Vue ElementUI Axios 前后端案例(day03) 之 Axios

前置知识 AJAX 前置知识 答疑 问&#xff1a;我们是否可以这么理解&#xff0c;发送url请求就是服务器之间建立连接&#xff0c;tcp三次握手之后 其中与服务器进行数据交换&#xff1a;通过AJAX可以给服务器发送请求 就是连接建立以后 我们发送我们的浏览器数据 就是所谓的…

家用洗地机有什么优缺点?入门级家用洗地机

家用清洁产品近几年发展迅猛&#xff0c;扫拖机器人、洗地机等热门品类更是在家电产品销量普遍下滑的趋势下&#xff0c;仍然保持着大幅增长。越来越多的消费者开始关注清洁类产品&#xff0c;但扫拖机器人和吸尘器的清洁效果有限&#xff0c;洗地机会在功能上更加的完善&#…

2023年全国职业院校技能大赛软件测试赛题第1套

2023年全国职业院校技能大赛 软件测试赛题第1套 赛项名称&#xff1a; 软件测试 英文名称&#xff1a; Software Testing 赛项编号&#xff1a; GZ034 归属产业&#xff1a; 电子与信息大类 …

通过适当的异常处理进行快速调试

编写良好的代码和异常处理 作为开发人员&#xff0c;开发中最令人恼火的部分通常是调试。与我共事过的大多数程序员都会赞同这种观点。通常&#xff0c;看到异常的第一反应是烦恼和沮丧的混合。易于调试的异常通常会在调试后的几分钟内产生根本原因。最让我烦恼的是那些在系统…

vue实现多布局模式

1、目标效果 源码地址&#xff1a;multipal-layout-demo: vue2实现多布局暗黑模式 默认布局&#xff1a;头部宽度100%&#xff0c;侧边栏、内容区 顶部布局&#xff1a;头部宽度100%&#xff0c;内容区 侧边栏布局&#xff1a;侧边栏高度100%&#xff0c;头部、内容区 2、原理…

python+vue课堂教学效果实时评价系统

系统权限按管理员&#xff0c;教师和学生这三类涉及用户划分。 (a) 管理员&#xff1b;管理员使用本系统涉到的功能主要有&#xff1a;个人中心&#xff0c;学生管理&#xff0c;教师管理&#xff0c;教学视频管理&#xff0c;教学课件管理&#xff0c;类型管理&#xff0c;视频…

ArcGIS Pro导航工具

主要导航工具为浏览工具 、屏幕导航器 、书签 、转到XY工具 。 其它还包括链接视图、地图比例&#xff08;2D&#xff09;、场景高度&#xff08;3D&#xff09;、暂停并刷新绘制、照相机属性、在3D模式下导航、键盘快捷键等。 1 主要导航工具 地图和场景的默认工具为浏览工具…

【python视图3】networkx图操作示例

一、说明 根据定义&#xff0c;图是节点&#xff08;顶点&#xff09;以及已识别的节点对&#xff08;称为边、链接等&#xff09;的集合。在 NetworkX 中&#xff0c;节点可以是任何可哈希对象&#xff0c;例如文本字符串、图像、XML 对象、另一个图形、自定义节点对象等。 如…