本文介紹如何將文件流、網絡流等數據流以流式上傳的方式上傳到存儲空間(Bucket)中的文件(Object)。
上傳文件流
以下代碼用于將文件流上傳到目標存儲空間examplebucket中exampledir目錄下的exampleobject.txt文件。
const OSS = require('ali-oss');
const fs = require('fs');
const client = new OSS({
// yourRegion填寫Bucket所在地域。以華東1(杭州)為例,Region填寫為oss-cn-hangzhou。
region: 'yourRegion',
// 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
authorizationV4: true,
// 填寫Bucket名稱,例如examplebucket。
bucket: 'examplebucket',
});
async function putStream () {
try {
// 使用chunked encoding。使用putStream接口時,SDK默認會發起一個chunked encoding的HTTP PUT請求。
// 填寫本地文件的完整路徑,從本地文件中讀取數據流。
// 如果本地文件的完整路徑中未指定本地路徑,則默認從示例程序所屬項目對應本地路徑中上傳文件。
let stream = fs.createReadStream('D:\\localpath\\examplefile.txt');
// 填寫Object完整路徑,例如exampledir/exampleobject.txt。Object完整路徑中不能包含Bucket名稱。
let result = await client.putStream('exampledir/exampleobject.txt', stream);
// 不使用chunked encoding。如果在options指定了contentLength參數,則不會使用chunked encoding。
// let stream = fs.createReadStream('D:\\localpath\\examplefile.txt');
// let size = fs.statSync('D:\\localpath\\examplefile.txt').size;
// let result = await client.putStream(
// stream參數可以是任何實現了Readable Stream的對象,包含文件流,網絡流等。
// 'exampledir/exampleobject.txt', stream, {contentLength: size});
console.log(result);
} catch (e) {
console.log(e)
}
}
putStream();
上傳網絡流
以下代碼用于將網絡流上傳到目標存儲空間examplebucket中exampledir目錄下的exampleobject.txt文件。
const OSS = require("ali-oss");
const fs = require("fs");
const urllib = require("urllib");
const client = new OSS({
// yourRegion填寫Bucket所在地域。以華東1(杭州)為例,Region填寫為oss-cn-hangzhou。
region: 'yourRegion',
// 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
authorizationV4: true,
// 填寫Bucket名稱,例如examplebucket。
bucket: 'examplebucket',
});
// 指定網絡流URL。
const url = "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20220908/cbgh/圖片處理_example.jpg";
// 導入雙工流。
// stream參數可以是任何實現了Readable Stream的對象,包含文件流,網絡流等。
const Duplex = require("stream").Duplex;
// 實例化雙工流。
let stream = new Duplex();
urllib.request(url, (err, data, res) => {
if (!err) {
// 通過雙工流接收數據。
stream.push(data);
stream.push(null);
client
// 填寫Object完整路徑,例如example.png。Object完整路徑中不能包含Bucket名稱。
.putStream("example.png", stream)
.then((r) => console.log(r))
.catch((e) => console.log(e));
}
});
相關文檔
關于流式上傳的完整示例代碼,請參見GitHub示例。
文檔內容是否對您有幫助?