node或浏览器上传文件到阿里云OSS

阿里云配置

进入阿里云OSS Bucket 列表的某个 Bucket 仓库下,点击访问控制 RAM

创建用户

勾上 创建 AccessKey ID 和 AccessKey Secret

复制 AccessKey 信息 用文档保存

创建角色

选择云账号

复制 ARN 用文档保存,然后 新增权限

搜索 oss 选择 AliyunOSSFullAccess 策略后保存

返回 oss 的 Bucket 管理页面,设置读写权限

设置跨域,创建规则,可以填写局域网地址,用于测试

点击概览,复制 Bucket 外网访问地址上的 oss-cn-地域,用文档保存

nodeJS上传

node接收文件或选择文件直接上传

javascript 复制代码
const path = require('path')
const OSS = require('ali-oss')

const client = new OSS({
  // 开启 endpoint 时 region 无效;二选一,具体区别可以看官网文档
  // region: 'oss-cn-shenzhen',
  endpoint: 'oss-cn-shenzhen.aliyuncs.com',  // Endpoint(地域节点)外网访问
  accessKeyId: '创建用户时复制的 AccessKey ID',
  accessKeySecret: '创建用户时复制的 AccessKey Secret',
  bucket: 'Bucket存储空间名称',
  // internal: true // 是否通过阿里云内部网络接入OSS
  // cname: true  // 默认为false,使用自定义域名访问oss。如果为true,则可以用自定义域名填充端点字段
  // secure: true, // 是否返回HTTPS链接,默认false,开启传输加速时必须为true
  timeout: 10 * 60 * 1000 // 设置链接超时时间
})

// 获取oss文件列表
async function list() {
  // 不带任何参数,默认最多返回100个文件。
  const result = await client.list()
  console.log(result)
}
list()

// 上传文件
const putOSS = (file_name, file_path) => {
  return new Promise(async (resolve, reject) => {
    try {
      if (!file_name || !file_path) throw 'file_name or file_path error'
      const result = await client.put(file_name, path.normalize(file_path))
      if (result.res.status !== 200) throw 'error'
      resolve(result.url)
    } catch (err) {
      reject(err)
    }
  })
}

putOSS('文件名称', '文件路径')

官方参考

安装OSS Node.js SDK_对象存储(OSS)-阿里云帮助中心

Browser.js浏览器上传

浏览器上传建议使用 STS 方式来进行API访问

1、后端生成临时访问密钥

安装依赖

bash 复制代码
npm i ali-oss

后端 nodeJS 调用STS服务生成临时访问密钥

javascript 复制代码
const OSS = require('ali-oss')

async function getSTSToken() {
  const sts = new OSS.STS({
    accessKeyId: '创建用户时复制的 AccessKey ID',
    accessKeySecret: '创建用户时复制的 AccessKey Secret'
  })

  const result = await sts.assumeRole(
    'acs:ram::*****:role/test-oss-juese', // 创建角色时生成的 ARN
    '', // 自定义权限策略(可选)
    3600, // 凭证有效期,单位为秒
    'sessiontest' // 自定义会话名称
  )

  console.log('AccessKeyId:', result.credentials.AccessKeyId)
  console.log('AccessKeySecret:', result.credentials.AccessKeySecret)
  console.log('SecurityToken:', result.credentials.SecurityToken)
  console.log('Expiration:', result.credentials.Expiration)
  
  return result.credentials // 生成的临时密钥
}

const sts_token = getSTSToken()

// 可以写个node接口把 sts_token 传给前端

2、前端上传

安装依赖

bash 复制代码
npm i ali-oss

前端请求后端,获取生成的临时密钥,然后使用临时密钥 访问/上传文件

javascript 复制代码
const OSS = require('ali-oss')
import axios from 'axios'

let sts_token = null

const getOssClient = () => {
  return new Promise(async (resolve, reject) => {
    try {
      if (!sts_token || new Date(sts_token.Expiration) <= new Date()) {
        const res  = await axios.get('get_sts_token') // 请求后端获取sts_token
        sts_token = res.data
      }
      const { AccessKeyId, AccessKeySecret, SecurityToken } = sts_token
      const oss_client = new OSS({
        // endpoint: 'https://oss-accelerate.aliyuncs.com',
        region: 'oss-cn-hongkong', // Bucket所在地域。以华东1(杭州)为例,填写为oss-cn-hangzhou
        authorizationV4: true,
        accessKeyId: AccessKeyId,
        accessKeySecret: AccessKeySecret,
        stsToken: SecurityToken,
        bucket: 'Bucket名称',
        secure: true,
        timeout: 10 * 60 * 1000
      })
      resolve(oss_client)
    } catch (error) {
      sts_token = null
      reject(error)
    }
  })
}

// 测试访问文件列表
async function list() {
  try {
    const oss_client = await getOssClient()
    // 默认最多返回1000个文件。
    const result = await oss_client.list()
    console.log(result)
  } catch (e) {
    console.log(e)
  }
}
// list()

async function uploadFile() {
  try {
    const ossClient = await getOssClient();
    const file = new File(['hello world'], 'test.txt'); // 假设是浏览器环境
    const filePath = 'uploads/test.txt'; // OSS 存储路径

    const result = await ossClient.put(filePath, file);
    console.log('Upload success:', result);
  } catch (error) {
    console.error('Upload failed:', error);
  }
}
// uploadFile()

3、官方参考

安装和使用OSS Browser.js SDK_对象存储(OSS)-阿里云帮助中心

参数配置

javascript 复制代码
配置Client
您可以在初始化Client时按需添加配置项,例如通过timeout指定请求超时时间,通过stsToken指定临时访问凭证等。关于Browser.js支持的配置项以及配置示例,具体参数请参考下方说明。

options参数说明:
accessKeyId {String}:在阿里云控制台网站上创建的访问密钥。

accessKeySecret {String}:在阿里云控制台创建的访问密钥秘密。

[stsToken] {String}:用于临时授权。

[refreshSTSToken] {Function}:当STS信息过期时自动设置stsToken、accessKeyId、accessKeySecret的函数。返回值必须是包含stsToken、accessKeyId、accessKeySecret的对象。

[refreshSTSTokenInterval] {number}:STS令牌刷新间隔时间(毫秒)。应小于STS信息的过期间隔,默认为300000毫秒(5分钟)。

[bucket] {String}:您想访问的默认Bucket。如果没有Bucket,请先使用putBucket()创建一个。

[endpoint] {String}:OSS区域域名。优先级高于region。根据需要设置为外网域名、内网域名或加速域名等,请参考终端节点列表。

[region] {String}:Bucket数据所在的区域位置,默认为oss-cn-hangzhou。

[internal] {Boolean}:是否通过阿里云内网访问OSS,默认为false。如果您的服务器也在阿里云上运行,可以设置为true以节省大量费用。

[secure] {Boolean}:指示OSS客户端使用HTTPS(secure: true)还是HTTP(secure: false)协议。

[timeout] {String|Number}:针对所有操作的实例级别超时时间,默认为60秒。

[cname] {Boolean}:默认为false,使用自定义域名访问OSS。如果为true,则可以在endpoint字段中填写自定义域名。

[isRequestPay] {Boolean}:默认为false,表示是否开启Bucket的请求者支付功能,如果为true,会向OSS服务器发送头部'x-oss-request-payer': 'requester'。

[useFetch] {Boolean}:默认为false,仅在浏览器环境中生效。如果为true,意味着使用fetch模式上传对象,否则使用XMLHttpRequest。

[enableProxy] {Boolean}:启用代理请求,默认为false。注意启用代理请求时,请确保已安装proxy-agent。

[proxy] {String | Object}:代理URI或选项,默认为null。

[retryMax] {Number}:当请求因网络错误或超时出错时自动重试发送请求的最大次数。不支持流式上传(如put、putStream、append等),因为流只能被消费一次。

[maxSockets] {Number}:每个主机允许的最大套接字数。默认为无限。

[authorizationV4] {Boolean}:使用V4签名。默认为false。