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

news2024/9/20 16:18:49

本文介绍如何在鸿蒙环境下将文件上传到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-type
      if (fileName && method === "PUT") {
        const fileNameSplit = fileName.split(".");
    
        reqHeaders["content-type"] = mime.getType(
          fileNameSplit.length > 1 ? fileNameSplit[fileNameSplit.length - 1] : ""
        );
      }
    
      // 生成V4签名URL
      const 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的签名URL
    signUrlResult = 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.coloradmin.cn/o/2149386.html

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

相关文章

大厂常问的MySQL事务隔离到底怎么回答

什么是事务 事务就是一组原子性的SQL查询&#xff0c;或者说一个独立的工作单元。事务内的语句&#xff0c;要么全部执行成功&#xff0c;要么全部执行失败。 关于事务银行系统的应用是解释事务必要性的一个经典例子。 假设一个银行的数据库有两张表&#xff1a;支票表&#x…

OpenAI o1大模型:提示词工程已死

OpenAI 最近发布了最新大模型 o1&#xff0c;通过强化学习训练来执行复杂的推理任务&#xff0c;o1 在多项基准测试中展现了博士级别的推理能力&#xff0c;甚至在某些情况下可以与人类专家相媲美。 当你使用 o1 的时候&#xff0c;会发现文档中多了一项提示词建议。 翻译一下&…

OBB-最小外接矩形包围框-原理-代码实现

前言 定义&#xff1a;OBB是相对于物体方向对齐的包围盒&#xff0c;不再局限于坐标轴对齐&#xff0c;因此包围点云时更加紧密。优点&#xff1a;能够更好地贴合物体形状&#xff0c;减少空白区域。缺点&#xff1a;计算较为复杂&#xff0c;需要计算物体的主方向&#xff0c…

二叉树的遍历【C++】

对于二叉树系列的题&#xff0c;必须要会遍历二叉树。 遍历的有&#xff1a;深度优先&#xff1a;前序、中序、后序&#xff0c;广度优先&#xff1a;层序遍历 什么序是指处理根节点在哪个位置&#xff0c;比如前序是指处理节点顺序&#xff1a;根左右。 接下来要说明的是&…

深入浅出Docker

1. Docker引擎 Docker引擎是用来运行和管理容器的核心软件。通常人们会简单的将其指代为Docker或Docker平台。 基于开放容器计划&#xff08;OCI&#xff09;相关的标准要求&#xff0c;Docker引擎采用了模块化的设计原则&#xff0c;其组件是可替换的。 Docker引擎由如下主…

从理论到实践:全面指导企业实现数字化转型的战略路径

全球企业数字化转型的必然性 在全球范围内&#xff0c;数字化转型成为了企业战略中的核心命题。随着云计算、大数据、人工智能等新兴技术的快速发展&#xff0c;企业的运营模式、管理体系及客户体验正在发生深刻的变革。数字技术不仅为企业带来了新的商业机会&#xff0c;还使…

【Elasticsearch】-图片向量化存储

需要结合深度学习模型 1、pom依赖 注意结尾的webp-imageio 包&#xff0c;用于解决ImageIO.read读取部分图片返回为null的问题 <dependency><groupId>org.openpnp</groupId><artifactId>opencv</artifactId><version>4.7.0-0</versio…

【2025】中医药健康管理小程序(安卓原生开发+用户+管理员)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

海报制作哪个软件好?这些在线工具不容错过

国庆节的脚步越来越近&#xff0c;不少公司正计划利用这个时机开展一些特别的庆典活动。 在这些活动中&#xff0c;海报作为一种传统的宣传方式&#xff0c;仍然是不可或缺的。但在制作海报时&#xff0c;我们可能会遇到创意瓶颈、时间限制或者预算约束等问题。 幸运的是&…

高棉语翻译神器上线!中柬互译,OCR识别,语音翻译一应俱全,《柬埔寨语翻译通》App

全新的高棉语翻译神器已经正式上架&#xff01; 无论你是安卓还是iOS用户&#xff0c;现在都可以轻松开始使用&#xff0c;开启你的翻译之旅&#xff01; 这款应用不仅仅是一个简单的翻译工具&#xff0c;它还支持中文与高棉语的双向翻译。翻译结果可以语音播放&#xff0c;翻…

AI服务器是什么?为什么要用AI服务器?

AI服务器的定义 AI服务器是一种专门为人工智能应用设计的服务器&#xff0c;它采用异构形式的硬件架构&#xff0c;通常搭载GPU、FPGA、ASIC等加速芯片&#xff0c;利用CPU与加速芯片的组合来满足高吞吐量互联的需求&#xff0c;为自然语言处理、计算机视觉、机器学习等人工智…

企业微信-前往服务商后台页面对接解决方案

序 我会告诉你在哪里点我会告诉你在哪里配置点下去他只返回auth_code的&#xff0c;我怎么登录 正文 他是在这个位置 是这样&#xff0c;应用授权安装第三方应用后&#xff0c;企业微信&#xff08;管理员角色&#xff09;是可以从pc端企业后台点第三方应用的。 如果我没记…

【余弦相似度】

余弦相似度 又称为余弦距离&#xff0c;利用两个向量之间的夹角的余弦值来衡量两个向量的余弦相似度&#xff0c;两个向量夹角越小&#xff0c;余弦值越接近1。 向量模&#xff08;向量长度&#xff09;计算方法&#xff1a; n维向量的相似度计算&#xff1a; 余弦相似度的取…

黑盒测试 | 挖掘.NET程序中的反序列化漏洞

通过不安全反序列化漏洞远程执行代码 img 今天&#xff0c;我将回顾 OWASP 的十大漏洞之一&#xff1a;不安全反序列化&#xff0c;重点是 .NET 应用程序上反序列化漏洞的利用。 &#x1f4dd;$ _序列化_与_反序列化 序列化是将数据对象转换为字节流的过程&#xff0c;字节流…

Entity更新坐标不闪烁需采用setCallbackPositions方法赋值

问题描述&#xff1a; 1.new mars3d.graphic.PolygonEntity({在更新点位高度模拟水面上身的时候&#xff0c;会存在闪烁 2.当把addDemoGraphic4添加到图层后&#xff0c;addDemoGraphic1水位变化不闪烁&#xff0c;把addDemoGraphic4注释后&#xff0c;addDemoGraphic1闪烁。…

UI自动化测试的边界怎么定义?

标题&#xff1a;定义UI自动化测试的边界&#xff1a;从0到1的详细指南 引言&#xff1a; UI自动化测试是现代软件开发过程中至关重要的一环。为了确保自动化测试的有效性和准确性&#xff0c;我们需要明确定义测试的边界。本文将从0到1为您提供一篇详细且规范的指南&#xf…

基于YOLOv8/YOLOv9/YOLOv10的河道漂浮物检测识别系统

摘要&#xff1a; 河道漂浮物检测识别是指利用技术手段自动识别河流、湖泊等水体表面的漂浮垃圾或物体的过程。随着环境保护意识的增强和技术的进步&#xff0c;河道漂浮物检测已经成为水环境保护和管理的重要组成部分。这项技术的应用可以帮助及时发现污染源&#xff0c;采取措…

一些线上常用排查问题的命令

排查CPU过高时使用到的一些命令 top free df top命令 top 命令是一个动态的实时视图&#xff0c;显示系统的整体运行状况&#xff0c;包括 CPU 使用率、内存使用情况、进程信息等。 free 命令 free 命令用于显示系统中物理内存和交换内存的使用情况。 df 命令 df 命令用…

纯前端表格导出Excel

先写好两个js文件 直接复制粘贴 文件目录是这样的 Bolb.js /* eslint-disable */ /* Blob.js* A Blob implementation.* 2014-05-27** By Eli Grey, http://eligrey.com* By Devin Samarin, https://github.com/eboyjr* License: X11/MIT* See LICENSE.md*//*global self, …

Vuex 入门与实战

引言 Vuex 是 Vue.js 官方推荐的状态管理库&#xff0c;它可以帮助我们更好地管理 Vue 应用的状态。在大型应用中&#xff0c;组件之间的状态共享和通信是一个非常重要的问题&#xff0c;而 Vuex 提供了一种优雅的解决方案。 在 Vue 应用中&#xff0c;数据的流动一般是单向的…