全部產品
Search
文件中心

Object Storage Service:Node.js流式上傳

更新時間:Oct 29, 2024

本文介紹如何將檔案流、網路流等資料流以流式上傳的方式上傳到儲存空間(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樣本