Ali-OSS โ
OSS๏ผObject Storage Service๏ผ
้ฟ้ไบๅฏน่ฑกๅญๅจ OSS๏ผObject Storage Service๏ผๆฏไธๆฌพๆตท้ใๅฎๅ จใไฝๆๆฌใ้ซๅฏ้ ็ไบๅญๅจๆๅก๏ผๅฏๆไพ 99.9999999999%๏ผ12 ไธช 9๏ผ็ๆฐๆฎๆไน ๆง๏ผ99.995%็ๆฐๆฎๅฏ็จๆงใๅค็งๅญๅจ็ฑปๅไพ้ๆฉ๏ผๅ จ้ขไผๅๅญๅจๆๆฌใ
https://help.aliyun.com/zh/oss/
usage โ
- ๅฎ่ฃ SDK
- ๅๅปบ Bucket ๅนถ่ฎพ็ฝฎๆ้
- ่ทๅ AccessKey ่ฎฟ้ฎๆงๅถ RAM โ ็จๆท โ ๅๅปบ็จๆท โ ่ทๅ AccessKeyId / AccessKeySecret ๅปบ่ฎฎๅๅปบไธ็จๅญ่ดฆๅท๏ผๅนถๆไบๆๅฐๆ้๏ผๅฆ AliyunOSSFullAccess ๆ่ชๅฎไน็ญ็ฅ๏ผใ
oss-browser2 ๆต่งๅจ โ
ossbrowser 2.0ๆฏไธๆฌพ็จไบ็ฎก็OSS็ๅ ่ดนๅพๅฝขๅๆก้ขๅฎขๆท็ซฏใ
ๆ้ โ
Bucket ๆ้ๅผๅฏ ๅ ฌๅ ฑ่ฏป
ไฝฟ็จ โ
bash
npm iย ali-ossjs
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ๅฎขๆท็ซฏ็ดไผ โ
่ทจๅ่ฎฟ้ฎ ๅฎๅ จๆๆ
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("ไธไผ ๅคฑ่ดฅ");
}
});