鸿蒙环境服务端签名直传文件到OSS

本文介绍如何在鸿蒙环境下将文件上传到OSS。

背景信息

鸿蒙环境是当下比较流行的操作环境,与服务端签名直传的原理类似,鸿蒙环境上传文件到OSS是利用OSS提供的PutObject接口来实现文件上传到OSS。关于PutObject的详细介绍,请参见PutObject。

说明

本文只展示关于鸿蒙环境下服务端签名直传的关键代码片段,如果您需要了解更多详细信息,请下载完整示例:oss-js-sdk-harmony-demo.zip

步骤一:获取签名URL

为了您的数据安全,建议使用签名方式上传文件。OSS提供服务端签名和客户端签名两种签名方式, 这里以服务端签名为例:

说明

使用代码前,您需要先安装OSS SDK。更多信息,请参见安装。

使用服务端获取签名时,您需要先搭建一个签名服务,然后由客户端调用签名服务生成签名URL,具体步骤如下:

  1. 搭建服务端接口。

    const express = require("express");
    const mime = require("mime");
    const OSS = require("ali-oss");
    const app = express();
    const port = 3000; // 监听端口app.use(express.json());app.use(express.urlencoded({ extended: false }));app.post("/get_sign_url", async (req, res) => {const {fileName,method,headers = {},queries = {},additionalHeaders = [],} = req.body; // 从body中解析出数据const client = new OSS({region: "yourRegion",accessKeyId: "yourAccessKey",accessKeySecret: "yourAccessKeySecret",stsToken: "yourSTSToken",bucket: "yourBucket",authorizationV4: true,});const reqHeaders = {...headers,};// 处理一下content-typeif (fileName && method === "PUT") {const fileNameSplit = fileName.split(".");reqHeaders["content-type"] = mime.getType(fileNameSplit.length > 1 ? fileNameSplit[fileNameSplit.length - 1] : "");}// 生成V4签名URLconst url = await client.signatureUrlV4(method,300,{headers: reqHeaders,queries,},fileName,additionalHeaders);res.json({url,contentType: reqHeaders["content-type"],});
    });app.listen(port, () => {console.log(`Example app listening on port ${port}`);
    });
    
  2. 在客户端获取签名URL。

    import { http } from '@kit.NetworkKit';
    import fs from '@ohos.file.fs';
    import { request } from './request';const serverUrl = 'http://x.x.x.x:3000/get_sign_url'; // 获取签名URL的服务器URL/*** getSignUrl返回数据*/
    export interface ISignUrlResult {/** 签名URL */url: string;/** content-type */contentType?: string;
    }/*** 获取签名URL* @param fileName 文件名称* @param req 用于生成V4签名URL的请求信息* @param req.method 请求方式* @param [req.headers] 请求头* @param [req.queries] 请求查询参数* @param [req.additionalHeaders] 加签的请求头*/
    const getSignUrl = async (fileName: string, req: {method: 'GET' | 'POST' | 'PUT';headers?: Record<string, string | number>;queries?: Record<string, string>;additionalHeaders?: string[];
    }): Promise<ISignUrlResult> => {console.info('in getSignUrl');try {const response = await request(serverUrl, {method: http.RequestMethod.POST,header: {'Content-Type': 'application/json'},extraData: {fileName,method: req.method,headers: req.headers,queries: req.queries,additionalHeaders: req.additionalHeaders},expectDataType: http.HttpDataType.OBJECT}, 200);const result = response.result as ISignUrlResult;console.info('success getSignUrl');return result;} catch (err) {console.info('getSignUrl request error: ' + JSON.stringify(err));throw err;}
    };
    

步骤二:使用鸿蒙系统上传

使用签名URL上传文件,示例代码如下:

import { http } from '@kit.NetworkKit';
import fs from '@ohos.file.fs';
import { request } from './request';const putObject = async (fileUri: string): Promise<void> => {console.info('in putObject');const fileInfo = await fs.open(fileUri, fs.OpenMode.READ_ONLY);const fileStat = await fs.stat(fileInfo.fd);let signUrlResult: ISignUrlResult;console.info('file name: ', fileInfo.name);try {// 获取PutObject的签名URLsignUrlResult = await getSignUrl(fileInfo.name, {method: 'PUT',headers: {'Content-Length': fileStat.size},additionalHeaders: ['Content-Length']});} catch (e) {await fs.close(fileInfo.fd);throw e;}const data = new ArrayBuffer(fileStat.size);await fs.read(fileInfo.fd, data);await fs.close(fileInfo.fd);try {// 使用PutObject方法上传文件await request(signUrlResult.url, {method: http.RequestMethod.PUT,header: {'Content-Length': fileStat.size,'Content-Type': signUrlResult.contentType},extraData: data}, 200);console.info('success putObject');} catch (err) {console.info('putObject request error: ' + JSON.stringify(err));throw err;}
};

默认情况下,OSS存储空间中文件的读写权限是私有,仅文件拥有者具有访问文件的权限。但是,文件拥有者可以通过创建签名URL的方式与第三方用户分享文件,签名URL使用安全凭证的方式授权第三方用户在指定时间内下载或者预览文件。

注意事项

  • 生成签名URL过程中,SDK利用本地存储的密钥信息,根据特定算法计算出签名(signature),然后将其附加到URL上,以确保URL的有效性和安全性。这一系列计算和构造URL的操作都是在客户端完成,不涉及网络请求到服务端。因此,生成签名URL时不需要授予调用者特定权限。但是,为避免第三方用户无法对签名URL授权的资源执行相关操作,需要确保调用生成签名URL接口的身份主体被授予对应的权限。

    例如,通过签名URL下载或预览文件时,需要授予oss:GetObject权限。

  • 如需确保通过文件URL访问文件时是预览行为,您需要绑定自定义域名并添加CNAME记录。详情请参见绑定自定义域名至Bucket默认域名。

  • 获取私有文件URL时涉及设置URL的有效时长。超出文件URL设置的有效时长后,通过文件URL访问时会提示签名URL已过期,导致无法正常访问文件。如果您希望继续访问该文件,需要选择以下任意方式重新获取签名URL。

获取单个文件的URL

私有文件

公共读文件

如果文件读写权限ACL为私有,则必须进行签名操作。私有文件URL的格式为https://BucketName.Endpoint/Object?签名参数。您可以通过以下任意方法获取文件URL并设置URL的有效时长。

重要

文件URL的有效时长因账号类型存在差异。例如,阿里云账号通过OSS控制台可设置的文件URL有效时长最大为32400秒(9小时),RAM用户以及STS用户可设置的文件URL有效时长最大为3600秒(1小时)。如需获取更长时效的文件URL,请使用命令行工具ossutil、图形化管理工具ossbrowser或阿里云SDK。更多信息,请参见私有文件签名URL有效时长。

使用OSS控制台

使用图形化管理工具ossbrowser

使用阿里云SDK

使用命令行工具ossutil

您可以通过OSS控制台获取单个文件的URL。

  1. 登录OSS管理控制台。

  2. 单击Bucket列表,然后单击目标Bucket名称。

  3. 在左侧导航栏,选择文件管理 > 文件列表

  4. 获取文件URL。

    1. 单击目标文件名称。

    2. 详情面板配置以下参数,然后单击复制文件 URL

      复制URL

      参数

      说明

      过期时间

      当目标文件为私有文件时,需设置文件URL的有效时间。

      取值范围:60~32400

      单位:秒

      如果您希望设置更长过期时间的文件URL,您可以使用ossbrowser、sdk、ossutil等工具。

      自有域名

      如需确保第三方访问图片或网页文件时是预览行为,请使用Bucket绑定的自定义域名生成文件URL。

      仅当Bucket绑定自定义域名后可配置此项。更多信息,请参见绑定自定义域名。

      使用HTTPS

      默认使用HTTPS协议生成文件URL。如需使用HTTP协议生成文件URL,请关闭使用HTTPS开关。

获取多个文件的URL

仅OSS控制台支持批量获取多个文件的URL。

  1. 选中目标文件,然后单击下方的导出URL列表

    list

  2. 导出URL列表面板,配置以下参数:

    参数

    说明

    使用HTTPS

    默认使用HTTPS协议生成文件URL。如需使用HTTP协议生成文件URL,请关闭使用HTTPS开关。

    过期时间

    当目标文件为私有文件时,需设置文件URL的有效时间。

    取值范围:60~32400

    单位:秒

    若您希望获取更长时效的文件URL,建议使用命令行工具ossutil或图形化工具ossbrowser。

    自有域名

    如需确保第三方访问图片或网页文件时是预览行为,请使用Bucket绑定的自定义域名生成文件URL。

    仅当Bucket绑定自定义域名后可配置此项。更多信息,请参见绑定自定义域名。

    传输加速域名

    若第三方涉及跨国或跨洋等超远距离文件访问场景时,建议使用传输加速域名生成文件URL。

    仅当Bucket开启传输加速后可配置此项。更多信息,请参见开启传输加速。

  3. 单击确定,然后将URL列表文件保存到本地。

说明

如果您希望通过命令行管理工具ossutil、阿里云SDK批量获取多个文件的URL时:

  1. 通过GetBucket (ListObjects)接口获取所有Object的名称。

  2. 循环调用获取单个文件的URL方法。具体操作,请参见获取单个文件的URL。

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

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

相关文章

VMware安装飞牛私有云fnOS并挂载小雅Alist实现异地远程访问

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

记一次键盘f2和f5键被自动触发情况

背景&#xff1a; 联想小新笔记本电脑内置键盘&#xff0c;其中f2键和f5键一直被自动触发&#xff0c;已尝试过更换输入法&#xff0c;重装系统&#xff0c;拆开键帽清灰依旧无效。考虑维修费或者更换键盘&#xff08;内置&#xff09;费都挺贵的&#xff0c;而且f2和f5作用也…

Unity教程(十六)敌人攻击状态的实现

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程&#xff08;零&#xff09;Unity和VS的使用相关内容 Unity教程&#xff08;一&#xff09;开始学习状态机 Unity教程&#xff08;二&#xff09;角色移动的实现 Unity教程&#xff08;三&#xff09;角色跳跃的实现 Unity教程&…

2024java面试-软实力篇

为什么说简历很重要&#xff1f; 一份好的简历可以在整个申请面试以及面试过程中起到非常好的作用。 在不夸大自己能力的情 况 下&#xff0c;写出一份好的简历也是一项很棒的能力。为什么说简历很重要呢&#xff1f; 、 先从面试来说 假如你是网申&#xff0c;你的简历必然…

论文阅读-《Attention is All You Need》

注意力就是一切 【要点】&#xff1a;论文提出了一种全新的网络架构——Transformer&#xff0c;完全基于注意力机制&#xff0c;无需使用循环和卷积&#xff0c;实现了在机器翻译任务上的性能提升和训练效率的显著提高。 【方法】&#xff1a;通过构建一个仅使用注意力机制的…

【计算机网络 - 基础问题】每日 3 题(十三)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

cadence SPB17.4 - allegro - 用板子外形创建整板铺铜

文章目录 cadence SPB17.4 - allegro - 用板子外形创建整板铺铜概述笔记先确定自己板子的 board Geometry/Design_Outline 是否有外形shape为了将软件提示看得更清楚&#xff0c;在每个操作之前&#xff0c;先将命令提示区内容先删了用Z-copy从外形层生成整板的铺铜备注END cad…

【JS】postMessage与MessageChannel

前言 postMessage 和 MessageChannel 都是用来实现跨文档、跨窗口或跨线程&#xff08;Web Worker&#xff09;的消息传递机制。 postMessage 可以在 iframe、同源或跨源窗口之间传递数据&#xff0c;也可以用于主线程与 Web Worker 之间的通信。 postMessage 是一种单向的…

数据结构-3.1.栈的基本概念

一.栈的定义&#xff1a; 栈和线性表的区别&#xff1a;栈只能在表尾一端进行插入或者删除的操作&#xff0c;而线性表可以在任意一个地方进行插入或者删除 二.有关栈的关键术语&#xff1a; 三.栈的基本操作&#xff1a; 1.回顾线性表的基本操作&#xff1a; 2.栈的基本操作&…

佰朔资本:国内海风加速招标 船舶行业景气上行

昨日&#xff0c;沪指盘中一度下探失守2700点&#xff0c;尾盘在地产、银行等板块的带动下发力上扬&#xff0c;深证成指亦翻红。到收盘&#xff0c;沪指涨0.49%报2717.28点&#xff0c;深证成指涨0.11%报7992.25点&#xff0c;创业板指跌0.11%报1533.47点&#xff0c;上证50指…

商业终端架构技术-未来之窗行业应用跨平台架构

未来之窗行业应用跨平台架构 以下是对未来之窗行业应用跨平台架构中客户端的稳定优势和网页跨平台性质的扩展列举&#xff1a; 一、客户端的稳定优势&#xff1a; 1. 离线可用性 - 即使在没有网络连接的…

如何将MySQL卸载干净(win11)

相信点进来的你肯定是遇到了这个问题&#xff0c;那就是在安装MySQL的时候操作错误&#xff0c;最后结果不是自己想要的。卸载重新安装又发现安装不了。其实最主要的原因就是没有将MySQL卸载干净&#xff0c;那么如何把MySQL卸载干净&#xff1f;下面本篇文章就来给大家一步步介…

Tiny-universe 1:Qwen整体介绍Qwen-blog

Qwen模型架构讲解直播&#xff1a;直播链接 Qwen的整体架构与Llama2类似&#xff0c;如下图所示: 其中: tokenizer将文本转为词表里面的数值。数值经过embedding得到一一对应的向量。attention_mask是用来看见左边、右边&#xff0c;双向等等来设定。各类下游任务&#xff0…

Kafka集群扩容(新增一台kafka节点)

kafka集群扩容、kafka topic迁移 现有环境 IP组件角色192.168.17.51kafka01broker1192.168.17.52kafka02broker2192.168.17.53kafka03broker3 扩容之后环境 IP组件角色192.168.17.51kafka01broker1192.168.17.52kafka02broker2192.168.17.53kafka03broker3192.168.17.54ka…

InternVL 微调实践闯关任务

基础任务 follow 教学文档和视频使用QLoRA进行微调模型&#xff0c;复现微调效果&#xff0c;并能成功讲出梗图. 尝试使用LoRA&#xff0c;或调整xtuner的config&#xff0c;如LoRA rank&#xff0c;学习率。看模型Loss会如何变化&#xff0c;并记录调整后效果(选做&#xff…

【论文串烧】多媒体推荐中的模态平衡学习 | 音视频语音识别中丢失导致的模态偏差对丢失视频帧鲁棒性的影响

文章目录 一、多媒体推荐中的模态平衡学习1.1 研究背景1.2 解决问题1.3 实施方案1.4 文章摘要1.5 文章重点1.6 文章图示图 1&#xff1a;不同模型变体在 AmazonClothing 数据集上的初步研究图 2&#xff1a;CKD模型架构的说明图 3&#xff1a;在 Amazon-Clothing 数据集上训练过…

【LabVIEW】事件结构的用法

本篇文章记录我学习LabVIEW的事件结构用法&#xff0c;希望我的分享对你有所帮助&#xff01; 目录 一、案例说明 1、 LabVIEW实现“YAXBXC的计算” 2、添加事件结构 一、案例说明 在LabVIEW实现“YAXBXC的计算”的基础上&#xff0c;加上事件结构&#xff0c;实现单击一次按…

后端接收数组,集合类数据

文章目录 一. 请求行Path参数&#xff08;不建议&#xff09;二.数组接收&#xff08;不建议&#xff09;三.List集合接收&#xff08;建议&#xff09;四. GET请求既包含请求体又包含请求行 一. 请求行Path参数&#xff08;不建议&#xff09; DeleteMapping("/{ids}&quo…

分布式Redis(14)哈希槽

文章目录 一致性哈希算法理论普通哈希的问题一致性hash算法 Redis 使用哈希槽Redis Cluster集群 为什么Redis是使用哈希槽而不是一致性哈希呢&#xff1f;为什么Redis Cluster哈希槽数量是16384&#xff1f; 关键词&#xff1a;一致性 Hash&#xff0c;哈希槽&#xff0c; 带着…

iOS 巨魔神器,Geranium 天竺葵:6大功能,个个都解决痛点

嘿&#xff0c;这是黑猫。如果你装了巨魔&#xff0c;却只知道安装第三方APP&#xff0c;那就是暴殄天物。巨魔的价值不仅是应用侧载&#xff0c;还有强大的玩机工具生态——这也是我花费大量时间&#xff0c;去制作巨魔精选IPA合集的原因。 通过巨魔商店安装的APP&#xff0c…