rynn-k / gists
ali-oss.js javascript
const axios = require('axios');
const crypto = require('crypto');
const { fromBuffer } = require('file-type');

async function alioss(buffer, fn) {
    try {
        if (!buffer || !Buffer.isBuffer(buffer)) throw new Error('Image buffer is required.');
        
        const { mime, ext } = await fromBuffer(buffer);
        const filename = fn ? fn.includes('.') ? fn : `${fn}.${ext}` : `${Date.now()}.${ext}`;
        
        const { data } = await axios.get('https://visualgpt.io/api/v1/oss/sts-token');
        const { AccessKeyId, AccessKeySecret, SecurityToken } = data.data;
        
        const ossKey = `nekoo/${filename}`;
        const date = new Date().toUTCString();
        const stringToSign = `PUT\n\n${mime}\n${date}\nx-oss-security-token:${SecurityToken}\n/nc-cdn/${ossKey}`;
        const signature = crypto.createHmac('sha1', AccessKeySecret).update(stringToSign).digest('base64');
        const url = `https://nc-cdn.oss-us-west-1.aliyuncs.com/${ossKey}`;
        
        await axios.put(url, buffer, {
            headers: {
                authorization: `OSS ${AccessKeyId}:${signature}`,
                'content-type': mime,
                date: date,
                'x-oss-security-token': SecurityToken
            }
        });
        
        return url;
    } catch (error) {
        throw new Error(error.message);
    }
}

// Usage:
const fs = require('fs');
alioss(fs.readFileSync('./ex/image.jpg')).then(console.log);
1460 bytes ยท Updated Mar 22, 2026