Node.js NodeJS在内存流中异步下载和上载

Node.js NodeJS在内存流中异步下载和上载,node.js,google-drive-api,axios,Node.js,Google Drive Api,Axios,问题 如何通过NodeJS中的流异步下载和(可恢复/多部分)上载大型MP4文件(不使用文件系统) 场景 我正在编写一个类文件,它涉及到纯粹通过内存从URL到Google Drive或Dropbox的流式下载 **文件大小在下载和上载之前已知 视觉 ============== ^(5%) ^(10%) Downloader ============== ^(5%) ^(10%) Uploader 要求 通过内存流传输(不在文件

问题
如何通过NodeJS中的流异步下载和(可恢复/多部分)上载大型MP4文件(不使用文件系统)

场景
我正在编写一个类文件,它涉及到纯粹通过内存从URL到Google Drive或Dropbox的流式下载

**文件大小在下载和上载之前已知

视觉

==============
      ^(5%)  ^(10%)
Downloader

      ==============
            ^(5%)  ^(10%)
       Uploader
要求

  • 通过内存流传输(不在文件系统上存储任何内容)
  • 上传应该是多部分可恢复的,范围从5 Mb到>20 Gb
  • 如果下载或上载失败,则应进行一定次数的重试
  • 好奇

  • 双工流(如直通)是正确的方法吗
  • 如何在如上所示的异步方法中传递
    内容长度
  • 伪代码

    const axios = require('axios');
    const stream = require('stream');
    const passtrough = new stream.PassThrough();
    
    let sample = VideoAPI.get() // pass id
    //sample.url // url located here
    //sample.size // size is known prior to download or upload
    //sample.contentType // content-type is known prior to download
    
    //Download sample via Axios
    axios.get(sample.url, {
        responseType: "stream"
    }).then((response) => {
        //TODO: Pipe to Google Drive
        console.log('response', response)
    }).catch((error) => {
        console.error(error)
    })
    
    研究


  • 我想你需要这样的东西:

    request.get(sourceUrl).pipe(request.post(targetUrl))
    
    在此方案中,数据将从sourceUrl流向targetUrl,但不需要保存在服务器上的临时文件中


    欲了解详情,请访问

    问题出在哪里?你在琢磨什么?@Marc我最困惑的是如何在异步管道流中的多部分上传中正确传达内容长度。异步方法在这里不起作用。您必须先下载所有文件,操作“文件”或内存流,计算正文总长度并再次上载您的文件。我欣赏此操作的优雅。我注意到,我很好奇如何处理多部分或可恢复的上传,将一个大于1 GB的文件上传到目标URL,并考虑如何在上传中传递标题,尤其是
    内容长度
    。感谢您的分享。我遇到了这样一个发现:“请求也可以通过管道传递到自身。这样做时,内容类型和内容长度将保留在PUT头中。”这似乎在满足上述好奇心方面走上了正确的轨道,但我不确定,并将进行测试。我使用
    请求进度
    库实现了这一点,它的工作非常有魅力。谢谢你分享你的见解,朋友。@pixelbobby我很高兴听到这个消息。我们是来互相帮助的。祝你好运:)