簡體   English   中英

在不發送內容長度標頭的情況下在Node中流數據

[英]Stream data in Node without sending content-length header

我有此功能流緩沖的數據:

function doChunkInput() {
  console.log('Put Objects Chunk');
  let stream = new Readable({
    read() {}
  })

  for(i=0; i < 1000; i++) {
    stream.push(' data');
    stream.push(' more data');
    stream.push(' and more data');
  }

  // Pay attention to this
  // null indicates the end of the stream, so the `data` event will be fired
  stream.push(null)

  const params = {
    Bucket: bucket,
    Body: stream,
    Key: `sitemap.1.xml`,
  };
  return s3.upload(params).promise();

是否可以從流中不進行緩沖。 我想要的是在無法計算內容長度的地方傳輸數據。 在上面的示例中,正在緩沖區中進行計算。

我正在嘗試測試分塊上載,但是在上面的示例中, content-length標頭已添加到請求中,而transfer-encoding標頭則未添加。

簡短的答案是沒有。 AWS開發工具包不支持流傳輸,但是有很好的解決方法。

您可以上傳任意大小的部分(請注意,按照AWS的任何規定,每次上傳都需要支付少量費用-很多部分可能會增加到可見的成本)。 甚至還有一個很好的npm模塊,稱為: s3-stream-upload ,它公開了您可以通過管道傳輸的常規Writable流接口。

如果您希望對上傳內容有一些特殊的邏輯,可以使用我的scramjet -實際上很簡單:

const { StringStream } = require("scramjet");

const params = {Key: 'filename', Bucket: 'my-bucket'};
const { UploadId } = await s3.createMultipartUpload(params).promise();
let i = 1;

StringStream
    .from(function*() {
        for(i=0; i < 1000; i++) {
           yield ' data';
           yield ' more data';
           yield ' and more data';
        }
    })
    .toBufferStream()
    .breakup(1048576)   // you'd buffer every 1meg
    .map(
        (Body) => s3.uploadPart({
            ...params,
            Body,
            UploadId,
            PartNumber: i++
        }).promise()
    )
    .toArray()
    .then(
        parts => s3.completeMultipartUpload({
            ...params,
            MultipartUpload: {
                Parts: parts.map(
                    ({ ETag }, i) => ({ ETag, PartNumber: i + 1 })
                )
            }
        }).promise()
    )
    .catch(
        e => {
            console.error("error, aborting", e);
            return s3.abortMultipartUpload({...params, UploadId})
        }
    )

抱歉-我沒有運行上面的示例,因此更多地應該指導您進行操作-但如果您遇到問題,我明天可以解決。


編輯:現在,我了解到您想知道如何創建流並將其添加到流中而無需先構建整個流

我更改了上面的答案以從生成器創建流。 您還可以在示例中實現read方法,以通過this.push返回“數據”( 請參閱此處的文檔 ),但是我想使用this.push和generators會更簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM