小程序文件如何直接上传到oss?一篇文章搞定!

news2024/12/27 13:24:29

文件上传到 OSS 的小程序工具函数

此工具函数 uploadOss 用于在微信小程序中将临时文件上传到阿里云 OSS(对象存储服务)。它提供了灵活的参数设置,允许自定义文件路径、文件名前缀和文件目录。

目录

  • 环境依赖
  • 函数说明
  • 参数
  • 使用示例
  • 注意事项
  • 参考资料
  • 源码

环境依赖

  1. 需要使用 Taro 框架。(如果不是Taro,可以把前缀Taro.替换成uni.,或者是wx.调用)
  2. 阿里云 OSS 的相关配置和权限授权。
  3. getOssAuth 服务接口,用于获取 OSS 的授权信息。

函数说明

uploadOss 函数用于在小程序端将文件上传至指定的阿里云 OSS 存储桶。上传过程中调用 getOssAuth 函数以获取访问密钥、策略和签名。生成唯一的文件名后,使用 Taro.uploadFile 方法完成文件上传。

参数

参数名类型是否必选默认值说明
tmpUrlstring微信临时文件地址
prefixstring'clone'OSS 文件名前缀,用于标识文件来源,默认为 clone
fileNamestring'video'OSS 文件名
filePathstring'dh_awesome/dh_models/videos'OSS 文件目录,默认为视频目录

返回值

返回一个 Promise 对象,若上传成功则返回上传后的文件 URL,否则返回错误信息。

使用示例

以下是如何使用 uploadOss 函数将文件上传至 OSS 的示例:

import { uploadOss } from '@/utils/uploadOss/index';

const tmpFileUrl = '微信提供的临时文件路径';
uploadOss({
  tmpUrl: tmpFileUrl,
  prefix: 'custom_prefix', // 自定义前缀
  fileName: 'example_video', // 自定义文件名
  filePath: 'my_custom_path/videos', // 自定义文件路径
})
  .then((url) => {
    console.log('上传成功,文件地址:', url);
  })
  .catch((error) => {
    console.error('上传失败:', error);
  });

注意事项

  1. OSS 授权信息:调用 getOssAuth 获取授权信息时,确保接口返回包含 accessKeyIdpolicysignaturetoken 等字段,否则上传会失败。
  2. 文件名唯一性:函数中使用时间戳确保文件名唯一性,避免文件覆盖问题。
  3. 网络请求:上传文件是异步请求,建议在页面中展示上传进度或状态提示(如 Taro.showLoadingTaro.hideLoading)。
  4. 文件格式:该工具函数会自动获取文件的扩展名(后缀),请确保 tmpUrl 是有效的微信临时文件路径。
  5. 错误处理:若上传失败,可以查看返回的 statusCode 或错误信息,以便进行进一步调试。

参考资料

  • 阿里云官方文档:使用微信小程序上传文件到 OSS

源码

import { getOssAuth } from '@/service/oss';
import Taro from '@tarojs/taro';

interface UploadOssParams {
  tmpUrl: string; // 微信临时文件地址
  prefix?: string; // oss文件名前缀,默认为'clone'
  fileName?: string; // oss文件名,默认为'video'
  filePath?: string; // oss文件目录,默认为 'dh_awesome/dh_models/videos'
}
const OSS_BASE_URL ='你的远程oss仓库地址';

/**
 * 上传文件到OSS
 * // 桶名 digital-dh-prod-wlcb
 * @param {UploadOssParams} params - 上传文件所需的参数
 * @param {string} params.tmpUrl - 微信临时文件地址
 * @param {string} [params.prefix='clone'] - oss文件名前缀 clone克隆相关的文件
 * @param {string} [params.fileName='video'] - oss文件名
 * @param {string} [params.filePath='dh_awesome/dh_models/videos'] - oss文件目录-默认上传放在视频目录下
 * @returns {Promise<string>} 上传成功后返回文件的OSS地址
 */

export function uploadOss({
  tmpUrl,
  prefix = 'clone',
  fileName = 'video',
  filePath = 'dh_awesome/dh_models/videos',
}: UploadOssParams): Promise<string> {
  return new Promise(async (resolve, reject) => {
    if (!tmpUrl) {
      throw new Error('tmpUrl 参数是必填项,不能为空');
    }
    try {
      const res = await getOssAuth(); // 调用后端的接口,获取签名信息
      // 加入时间戳-以免文件名重复
      const unixTime = String(Date.parse(new Date().toString()) / 1000);
      //获取最后一个.的位置
      const fileIndex = tmpUrl.lastIndexOf('.');
      //获取文件后缀
      const fileExt = tmpUrl.substring(fileIndex + 1);
      const filePathName = `${filePath}/${prefix}_${fileName}_${unixTime}.${fileExt}`;

      const formData = {
        key: filePathName, //存放资源的位置及文件名
        OSSAccessKeyId: res.accessKeyId,
        policy: res.policy,
        signature: res.signature,
        'x-oss-security-token': res.token, // 使用STS签名时必传。
        success_action_status: 200, // 自定义成功返回的http状态码,默认为204
      };
      //   console.log(formData, 'formData');
      Taro.showLoading({ title: '上传中' });
      Taro.uploadFile({
        url: OSS_BASE_URL,
        filePath: tmpUrl,
        name: 'file', // 值必须为 file
        formData,
        success(result) {
          if (result.statusCode == 200) {
            // 最终的文件地址
            const url = `${OSS_BASE_URL}/${filePathName}`;
            resolve(url);
          } else {
            reject(result);
          }
        },
        fail: function (fail) {
          console.error(fail);
          reject(fail);
        },
        complete: function () {
          // 不管成功或失败都关闭showLoading
          Taro.hideLoading();
        },
      });
    } catch (error) {
      console.error(error);
      reject(error);
    }
  });
}

还有其他问题可以找我在这里插入图片描述

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

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

相关文章

使用Spring AI中的RAG技术,实现私有业务领域的大模型系统

前言 在上一篇文章《使用SpringAI快速实现离线/本地大模型应用》中&#xff0c;记录了如何使用SpringAI来调用我们的本地大模型&#xff0c;如何快速搭建一个本地大模型系统&#xff0c;并演示本地大模型的智能对话、图片理解、文生图等功能。 但在前文中&#xff0c;我们把S…

数据分析-系统认识数据分析

目录 数据分析的全貌 观测 实验 应用 数据分析的全貌 观测 实验 应用

4. 查看并更新langgraph节点

导入必要的库和设置工具 首先&#xff0c;我们需要导入一些必要的库&#xff0c;并设置我们的工具。这些工具将用于在Spotify和Apple Music上播放歌曲。 from langchain_openai import ChatOpenAI from langchain_core.tools import tool from langgraph.graph import Messag…

使用Java绘制图片边框,解决微信小程序map组件中marker与label层级关系问题,label增加外边框后显示不能置与marker上面

今天上线的时候发现系统不同显示好像不一样&#xff0c;苹果手机打开的时候是正常的&#xff0c;但是一旦用安卓手机打开就会出现label不置顶的情况。尝试了很多种办法&#xff0c;也在官方查看了map相关的文档&#xff0c;发现并没有给label设置zIndex的属性&#xff0c;只看到…

【专题】计算机网络之网络层

1. 网络层的几个重要概念 1.1 网络层提供的两种服务 (1) 让网络负责可靠交付 计算机网络模仿电信网络&#xff0c;使用面向连接的通信方式。 通信之前先建立虚电路 VC (Virtual Circuit) (即连接)&#xff0c;以保证双方通信所需的一切网络资源。 如果再使用可靠传输的网络…

vTESTstudio系列15--vTESTstudio-Doors的需求和测试用例的管理

最近有朋友在咨询vTESTstudio中怎么去跟Doors里面的需求去做好管理这方面的问题&#xff0c;临时加两篇文章介绍一下,Lets Go!!! 目录 1.Doors的配置&#xff1a; 1.1 安装Doors AddIn for vTESTstudio&#xff1a; 1.2 更新XML脚本&#xff1a; 1.3 导出需求的Trace Item…

波动中的金钥匙:趋势震荡指标——源码公布,仅供学习

趋势与震荡&#xff0c;两者在市场运行中紧密相连&#xff0c;相互影响。趋势往往是震荡累积后的自然延伸&#xff0c;而震荡则常常是趋势形成与调整的前奏。在各类行情与不同时间周期中&#xff0c;当前的震荡不过是更大周期趋势中的一个组成部分&#xff1b;相应的&#xff0…

面试_ABtest原理简介

01 什么是ABtest ABtest来源于假设检验&#xff0c;现有两个随机均匀的有样本组A、B&#xff0c;对其中一个组A做出某种改动&#xff0c;实验结束后分析两组用户行为数据&#xff0c;通过显著性检验&#xff0c;判断这个改动对于我们所关注的核心指标是否有显著的影响&#xf…

‘nodemon‘ 不是内部或外部命令,也不是可运行的程序

解决方法&#xff1a;使用 npx 临时运行 nodemon 如果你不想全局安装 nodemon&#xff0c;你可以使用 npx&#xff08;npm 5.2 及以上版本自带&#xff09;来临时运行 nodemon&#xff1a; npx nodemon server.jsnodemon正常配置 要在开发过程中实现每次修改 Node.js 代码后…

计算机网络基础(3)_应用层自定义协议与序列化

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 计算机网络基础(3)_应用层自定义协议与序列化 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&a…

E2E、CRC、Checksum、Rollingcounter

文章目录 前言1、E2E2、CRC3、Checksum4、Rollingcounter总结 前言 在专栏文章仿真CAN报文发送的CRC校验算法&#xff08;附CAPL代码&#xff09;和同星TSMaster中如何自定义E2E校验算法中分别给出了CRC算法和E2E校验实现&#xff0c;从中也明白了为什么在测试中需要去做这些仿…

嵌入式硬件杂谈(一)-推挽 开漏 高阻态 上拉电阻

引言&#xff1a;对于嵌入式硬件这个庞大的知识体系而言&#xff0c;太多离散的知识点很容易疏漏&#xff0c;因此对于这些容易忘记甚至不明白的知识点做成一个梳理&#xff0c;供大家参考以及学习&#xff0c;本文主要针对推挽、开漏、高阻态、上拉电阻这些知识点的学习。 目…

二叉树面试题(C 语言)

目录 1. 单值二叉树2. 相同的树3. 对称二叉树4. 二叉树的前序遍历5. 二叉树的中序遍历6. 二叉树的后序遍历7. 另一颗树的子树8. 通过前序遍历返回中序遍历 1. 单值二叉树 题目描述&#xff1a; 如果二叉树每个节点都具有相同的值&#xff0c;那么该二叉树就是单值二叉树。只有…

MFC中Excel的导入以及使用步骤

参考地址 在需要对EXCEL表进行操作的类中添加以下头文件&#xff1a;若出现大量错误将其放入stdafx.h中 #include "resource.h" // 主符号 #include "CWorkbook.h" //单个工作簿 #include "CRange.h" //区域类&#xff0c;对Excel大…

【C++】类中的“默认成员函数“--构造函数、析构函数、拷贝构造、赋值运算符重载

目录 "默认"成员函数 概念引入&#xff1a; 一、构造函数 问题引入&#xff1a; 1&#xff09;构造函数的概念 2&#xff09;构造函数实例 3&#xff09;构造函数的特性 4)关于默认生成的构造函数 (默认构造函数) 默认构造函数未完成初始化工作实例: 二…

LeetCode【0052】N皇后II

本文目录 1 中文题目2 求解方法&#xff1a;位运算回溯法2.1 方法思路2.2 Python代码2.3 复杂度分析 3 题目总结 1 中文题目 n 皇后问题 研究的是如何将 n 个皇后放置在 n n 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回 n 皇后问…

C语言-详细讲解-P1009 [NOIP1998 普及组] 高精度阶乘之和

目录 1.题目要求 2.题目解读 3.代码实现 4.一些小细节 1.数组储存大整数方式 2.memset函数介绍 3.digit与sum的关系 1.题目要求 2.题目解读 这道题本质就是高精度乘法高精度加法的结合&#xff0c;我之前有出过 高精度算法-保姆级讲解 希望详细了解的小伙伴可以去…

浅谈:基于三维场景的视频融合方法

视频融合技术的出现可以追溯到 1996 年 , Paul Debevec等 提出了与视点相关的纹理混合方法 。 也就是说 &#xff0c; 现实的漫游效果不是从摄像机的角度来看 &#xff0c; 但其仍然存在很多困难 。基于三维场景的视频融合 &#xff0c; 因其直观等特效在视频监控等相关领域有着…

Qt_day10_程序打包(完结)

目录 1. 设置图标 2. Debug和Release版本 3. 动态链接库 4. 打包 5. 联系项目要求 Qt开发的程序最终都是要给用户使用的&#xff0c;用户的电脑上不可能装一个Qt的开发环境导入项目使用。因此项目项目开发完成后需要打包——制作成安装包&#xff0c;用户直接下载并安装即可使用…

路径规划——RRT-Connect算法

路径规划——RRT-Connect算法 算法原理 RRT-Connect算法是在RRT算法的基础上进行的扩展&#xff0c;引入了双树生长&#xff0c;分别以起点和目标点为树的根节点同时扩展随机树从而实现对状态空间的快速搜索。在此算法中以两棵随机树建立连接为路径规划成功的条件。并且&…