Skip to content

Ali-OSS โ€‹

OSS๏ผˆObject Storage Service๏ผ‰

้˜ฟ้‡Œไบ‘ๅฏน่ฑกๅญ˜ๅ‚จ OSS๏ผˆObject Storage Service๏ผ‰ๆ˜ฏไธ€ๆฌพๆตท้‡ใ€ๅฎ‰ๅ…จใ€ไฝŽๆˆๆœฌใ€้ซ˜ๅฏ้ ็š„ไบ‘ๅญ˜ๅ‚จๆœๅŠก๏ผŒๅฏๆไพ› 99.9999999999%๏ผˆ12 ไธช 9๏ผ‰็š„ๆ•ฐๆฎๆŒไน…ๆ€ง๏ผŒ99.995%็š„ๆ•ฐๆฎๅฏ็”จๆ€งใ€‚ๅคš็งๅญ˜ๅ‚จ็ฑปๅž‹ไพ›้€‰ๆ‹ฉ๏ผŒๅ…จ้ขไผ˜ๅŒ–ๅญ˜ๅ‚จๆˆๆœฌใ€‚

https://help.aliyun.com/zh/oss/

usage โ€‹

  1. ๅฎ‰่ฃ… SDK
  2. ๅˆ›ๅปบ Bucket ๅนถ่ฎพ็ฝฎๆƒ้™
  3. ่Žทๅ– AccessKey ่ฎฟ้—ฎๆŽงๅˆถ RAM โ†’ ็”จๆˆท โ†’ ๅˆ›ๅปบ็”จๆˆท โ†’ ่Žทๅ– AccessKeyId / AccessKeySecret ๅปบ่ฎฎๅˆ›ๅปบไธ“็”จๅญ่ดฆๅท๏ผŒๅนถๆŽˆไบˆๆœ€ๅฐๆƒ้™๏ผˆๅฆ‚ AliyunOSSFullAccess ๆˆ–่‡ชๅฎšไน‰็ญ–็•ฅ๏ผ‰ใ€‚

oss-browser2 ๆต่งˆๅ™จ โ€‹

https://help.aliyun.com/zh/oss/developer-reference/installing-the-ossbrowser-2-0?spm=a2c4g.11186623.0.0.223346efeSN7xA

ossbrowser 2.0ๆ˜ฏไธ€ๆฌพ็”จไบŽ็ฎก็†OSS็š„ๅ…่ดนๅ›พๅฝขๅŒ–ๆกŒ้ขๅฎขๆˆท็ซฏใ€‚

ๆƒ้™ โ€‹

Bucket ๆƒ้™ๅผ€ๅฏ ๅ…ฌๅ…ฑ่ฏป

ไฝฟ็”จ โ€‹

bash
npm iย ali-oss
js
const OSS = require('ali-oss');

const client = new OSS({
  region: 'oss-cn-hangzhou',
  accessKeyId: 'ไฝ ็š„KeyId',
  accessKeySecret: 'ไฝ ็š„KeySecret',
  bucket: 'ไฝ ็š„Bucketๅ็งฐ'
});

async function put() {
  try {
    const result = await client.put('test/hello.txt', './hello.txt');
    console.log(result.url);
  } catch (err) {
    console.error(err);
  }
}

put();

// ไธŠไผ ๆˆๅŠŸๅŽ๏ผŒไฝ ไผšๅพ—ๅˆฐไธ€ไธช URL๏ผš
// https://your-bucket.oss-cn-hangzhou.aliyuncs.com/test/hello.txt

ๅฎขๆˆท็ซฏ็›ดไผ  โ€‹

https://help.aliyun.com/zh/oss/user-guide/python-1?spm=a2c4g.11186623.0.0.15db5d03oLk0cl&userCode=okjhlpr5#c5d7a5a048tns

่ทจๅŸŸ่ฎฟ้—ฎ ๅฎ‰ๅ…จๆŽˆๆƒ

text
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚        ๅ‰็ซฏๆต่งˆๅ™จ      โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
           โ”‚ โ‘  ้€‰ๆ‹ฉๆ–‡ไปถ
           โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  ่ฏทๆฑ‚ๅŽ็ซฏ่Žทๅ–็ญพๅ       โ”‚
โ”‚  GET /signature      โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
            โ”‚ โ‘ก ่ฏทๆฑ‚็ญพๅ
            โ–ผ
  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
  โ”‚      ๅŽ็ซฏๆœๅŠก        โ”‚
  โ”‚ ็”Ÿๆˆ OSS V4 ็ญพๅ     โ”‚
  โ”‚ ่ฟ”ๅ›ž policy ็ญ‰ๅญ—ๆฎต   โ”‚
  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
             โ”‚ โ‘ข ่ฟ”ๅ›ž็ญพๅ JSON
             โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ ๅ‰็ซฏๆž„้€  FormData ่กจๅ•     โ”‚
โ”‚ key / policy / signature โ”‚
โ”‚ x-oss-credential / file  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
            โ”‚ โ‘ฃ POST ไธŠไผ 
            โ–ผ
  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
  โ”‚        OSS ๆœๅŠก       โ”‚
  โ”‚ ๆ ก้ชŒ็ญพๅ & ไฟๅญ˜ๆ–‡ไปถ     โ”‚
  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
             โ”‚ โ‘ค ่ฟ”ๅ›ž 204
             โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ ๅ‰็ซฏๆ‹ผๆŽฅๆ–‡ไปถ URL           โ”‚
โ”‚ https://bucket.region/   โ”‚
โ”‚         + key            โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
js
import OSS from 'ali-oss';
import express from 'express';
import cors from 'cors';

const app = express();
app.use(cors());

// OSS ๅŸบ็ก€้…็ฝฎ๏ผˆไฝฟ็”จๅ›บๅฎš AK๏ผŒไธๅซ STS๏ผ‰
const config = {
  region: 'oss-cn-beijing',
  accessKeyId: 'XXXXXXXX',
  accessKeySecret: 'XXXXXXXX',
  bucket: 'nodejs-oss'
};

const client = new OSS(config);

app.get('/', async (req, res) => {
  // -------------------------------
  // 1. ่ฎพ็ฝฎ็ญพๅ่ฟ‡ๆœŸๆ—ถ้—ด๏ผˆ10 ๅˆ†้’Ÿ๏ผ‰
  // -------------------------------
  const expire = new Date(Date.now() + 10 * 60 * 1000);
  const isoExpire = expire.toISOString();

  // -------------------------------
  // 2. ็”Ÿๆˆ V4 ๆ‰€้œ€ credential
  //    ๆ ผๅผ๏ผš<AccessKeyId>/<Date>/<Region>/oss/request
  // -------------------------------
  const dateStr = isoExpire.split('T')[0];
  const credential = OSS.getCredential(
    dateStr,
    OSS.getStandardRegion(config.region),
    config.accessKeyId
  );

  // -------------------------------
  // 3. ๆž„้€  V4 policy
  //    ๅฟ…้กปๅŒ…ๅซ๏ผš
  //    - bucket
  //    - x-oss-credential
  //    - x-oss-signature-version
  //    - x-oss-date
  //    - ๆ–‡ไปถๅคงๅฐ้™ๅˆถ๏ผˆๅฏ้€‰๏ผ‰
  // -------------------------------
  const policy = {
    expiration: isoExpire,
    conditions: [
      { bucket: config.bucket },
      { 'x-oss-credential': credential },
      { 'x-oss-signature-version': 'OSS4-HMAC-SHA256' },
      { 'x-oss-date': isoExpire },
      ['content-length-range', 0, 1048576000] // ้™ๅˆถๆœ€ๅคง 1GB
    ]
  };

  // -------------------------------
  // 4. ไฝฟ็”จ OSS SDK ็”Ÿๆˆ V4 ็ญพๅ
  // -------------------------------
  const signature = client.signPostObjectPolicyV4(policy, new Date());

  // -------------------------------
  // 5. ๆ‹ผๆŽฅไธŠไผ  host
  // -------------------------------
  const host = `https://${config.bucket}.${config.region}.aliyuncs.com`;

  // -------------------------------
  // 6. ่ฟ”ๅ›žๅ‰็ซฏ็›ดไผ ๆ‰€้œ€ๅญ—ๆฎต
  // -------------------------------
  res.json({
    host, // ไธŠไผ ๅœฐๅ€
    policy: Buffer.from(OSS.policy2Str(policy)).toString('base64'), // Base64 ็ผ–็ ๅŽ็š„ policy
    signature, // V4 ็ญพๅ
    x_oss_credential: credential, // V4 credential
    x_oss_signature_version: 'OSS4-HMAC-SHA256', // ๅ›บๅฎšๅ€ผ
    x_oss_date: isoExpire, // ISO ๆ ผๅผๆ—ถ้—ด
    dir: 'user-dir/' // ไธŠไผ ๆ–‡ไปถๅ‰็ผ€๏ผˆๅ‰็ซฏ้œ€่‡ช่กŒๆ‹ผๆŽฅ key๏ผ‰
  });
});

app.listen(3000, () => {
  console.log('server is running on port 3000');
});
js
document.getElementById('fileInput').addEventListener('change', async function (event) {
    const file = event.target.files[0];
    if (!file) return;

    // 1. ่Žทๅ–ๆœๅŠก็ซฏ็ญพๅ
    const res = await fetch("http://localhost:3000/");
    const data = await res.json();
    console.log("Fetched signature:", data);

    const {
        host,
        policy,
        signature,
        x_oss_credential,
        x_oss_signature_version,
        x_oss_date,
        dir
    } = data;

    // 2. ็”Ÿๆˆๆ–‡ไปถๅ๏ผˆ้ฟๅ…่ฆ†็›–๏ผ‰
    const filename = Date.now() + "_" + file.name;
    const objectKey = dir + filename;

    // 3. ๆž„้€  V4 ่กจๅ•ๆ•ฐๆฎ
    const formData = new FormData();
    formData.append("key", objectKey); // ๅฟ…้กปๅญ—ๆฎต
    formData.append("policy", policy);
    formData.append("signature", signature);
    formData.append("x-oss-credential", x_oss_credential);
    formData.append("x-oss-signature-version", x_oss_signature_version);
    formData.append("x-oss-date", x_oss_date);
    formData.append("file", file);

    // 4. ไธŠไผ ๅˆฐ OSS
    const uploadRes = await fetch(host, {
        method: "POST",
        body: formData
    });

    if (uploadRes.ok) {
        const fileUrl = `${host}/${objectKey}`;
        console.log("Upload success:", fileUrl);
        alert("ไธŠไผ ๆˆๅŠŸ๏ผš" + fileUrl);
    } else {
        console.error("Upload failed:", uploadRes.statusText);
        alert("ไธŠไผ ๅคฑ่ดฅ");
     }
    });

Released under the MIT License.