当前位置: 首页 > 知识库问答 >
问题:

Node.js中大文件上传至Azure blob的处理

公宜春
2023-03-14

我的目标是将一个大文件(任何文件类型)上传到Azure Blob中。

1. Convert file into stream and upload into Azure blob
2. Convert file into block streams and commit all the blocks to Azure blob in parallel
    var blobName = "azure-blob-name.doc";
    var fileSize = fs.statSync(fileName).size;
    var readableStream = fs.createReadStream(fileName, 'utf-8');
        blobService.createBlockBlobFromStream(containerName, blobName, readableStream, fileSize, function (error, result, response) { 
            if(error) console.log(error);
            console.log({message : "blob uploaded"});
        });
var fileName = "local-file-path/filename.doc";
    var blobName = "azure-blob-name.doc";
    var fileSize = fs.statSync(fileName).size;
    var readableStream = fs.createReadStream(fileName, 'utf-8');
    var bl=1;
    var blockIds = [];
    readableStream.on("data", function (chunk) {
        var blockId = 'block'+bl;
        bl++;
        blobService.createBlockFromStream(blockId, containerName, blobName, chunk, chunk.length, function(error, response){
            if(error) console.log(error);

            blockIds.push(blockId);
                    console.log({message : "block created"});
        });
    });

下面是我得到的错误

    D:\main-workspace\file-management\node_modules\azure-storage\lib\common\services\storageserviceclient.js:522
                body.outputStream.on('open', function () {
                                  ^
    TypeError: body.outputStream.on is not a function
  1. 方法1工作很好,但上传时间太长。(统计数据:上传40 MB文件花了80秒)。
  2. 我的第二个方法是正确的一个提高性能?如果是,如何实现此方法?

有没有更好的方法来提高性能?在这方面有什么建议吗?

      const stream = require('stream');
      var fileName = "local-file-path/filename.doc";
      var blobName = "azure-blob-name.doc";
      var fileSize = fs.statSync(blobName).size;
      var customBlockSize = 1200; //1.2 MB CAP           
      var NoOfBlocks = Math.ceil(fileSize/customBlockSize);
      var blockIdLength = NoOfBlocks.toString().length;
      var readableStream = fs.createReadStream(fileName, 'utf-8');
      var bl=1;
      var blockIds = [];
      readableStream.on("data", function (chunk) {         
          var blockId = 'block'+ blockGuId(bl, blockIdLength);//Block ids must be of same length
          bl++;
          const bufferStream = new stream.PassThrough({
            highWaterMark: chunk.length
          });
          bufferStream.end(chunk);
          blobService.createBlockFromStream(blockId, containerName, blobName, bufferStream, chunk.length, function(error, response){
              if(error) console.log(error);

              blockIds.push(blockId);
              console.log({message : "block ("+blockId+") created"});
          });
      });

      readableStream.on("end", function(){

        console.log('readableStream.on "end"');

        blobService.commitBlocks(containerName, blobName, blockIds, function(error, result){
          if(error) console.log(error);

          console.log({message : "all blocks uploaded"});
          var hrend = process.hrtime(hrstart)
          console.info('Execution time (sec ms): %ds %dms', hrend[0], hrend[1] / 1000000)
        });
      });

      blockGuId(number, blockIdLength)
      {
        return Array(Math.max(blockIdLength - String(number).length + 1, 0)).join(0) + number;
      }

下面是套接字错误

{ Error: socket hang up at createHangUpError (_http_client.js:323:15) at TLSSocket.socketCloseListener (_http_client.js:364:25) at TLSSocket.emit (events.js:187:15) at _handle.close (net.js:610:12) at TCP.done (_tls_wrap.js:386:7) code: 'ECONNRESET' }

我在这里错过了什么?为什么在创建块时发生套接字错误?

共有1个答案

阙繁
2023-03-14

您能否尝试以下代码:

const stream = require('stream');

var fileName = "local-file-path/filename.doc";
    var blobName = "azure-blob-name.doc";
    var fileSize = fs.statSync(fileName).size;
    var readableStream = fs.createReadStream(fileName, 'utf-8');
    var bl=1;
    var blockIds = [];
    readableStream.on("data", function (chunk) {
        //var blockId = 'block'+bl;
        bl++;
        var blockId = UseGuidHere();//Block ids must be of same length
        const bufferStream = new stream.PassThrough({
          highWaterMark: chunk.length
        });
        bufferStream.end(chunk);
        blobService.createBlockFromStream(blockId, containerName, blobName, bufferStream, chunk.length, function(error, response){
            if(error) console.log(error);

            blockIds.push(blockId);
                    console.log({message : "block created"});
        });
    });

正如代码中提到的,请为您的块id分配一个GUID,因为块id必须具有相同的长度。在您当前的逻辑中,在9个块之后,您的块id的长度将会改变,这将导致上传过程中的失败。

 类似资料:
  • 问题内容: 处理大文件上传时,Node.js是否会被阻止? 由于Node.js仅具有一个线程,是真的,当上传大文件时,所有其他请求都将被阻止吗? 如果是这样,我应该如何处理Node.js中的文件上传? 问题答案: 所有的I / O操作都由Node.js处理,内部使用多个线程。I / O功能的编程接口是单线程,基于事件和异步的。 因此,示例的大量上传工作由Node.js管理的单独线程执行,当该线程完

  • 用Flask处理非常大的文件上传(1 GB+)的最佳方式是什么? 我的应用程序基本上接受多个文件,为它们分配一个唯一的文件号,然后根据用户选择的位置将其保存在服务器上。 我们如何运行文件上传作为一个后台任务,这样用户就不会有浏览器旋转1小时,而是可以立即进入下一页? null

  • 本文向大家介绍PHP文件上传问题汇总(文件大小检测、大文件上传处理),包括了PHP文件上传问题汇总(文件大小检测、大文件上传处理)的使用技巧和注意事项,需要的朋友参考一下 由于涉及到本地和服务器两方面的安全问题,所以基于input type="file"形式的页面文件上传一直处于一个很尴尬的位置。一方面,用户不希望隐私泄露,所以浏览器无法对用户在上传时选择的文件做有效的判 断。另一方面,为了服务器

  • 问题内容: 用Flask处理超大文件上传(1 GB以上)的最佳方法是什么? 我的应用程序实际上需要多个文件,为它们分配一个唯一的文件号,然后根据用户选择的位置将其保存在服务器上。 我们如何将文件上传作为后台任务运行,以使用户在1小时内没有浏览器旋转,而是可以立即进入下一页? Flask开发服务器能够处理大量文件(50gb需要1.5个小时,上传速度很快,但将文件写入空白文件的速度却很慢) 如果我用T

  • 你想处理一个由用户上传的文件,比如你正在建设一个类似Instagram的网站,你需要存储用户拍摄的照片。这种需求该如何实现呢? 要使表单能够上传文件,首先第一步就是要添加form的enctype属性,enctype属性有如下三种情况: application/x-www-form-urlencoded 表示在发送前编码所有字符(默认) multipart/form-data 不对字符

  • 当解析器MultipartResolver完成处理时,请求便会像其他请求一样被正常流程处理。首先,创建一个接受文件上传的表单将允许用于直接上传整个表单。编码属性(enctype="multipart/form-data")能让浏览器知道如何对多路上传请求的表单进行编码(encode)。 <html> <head> <title>Upload a file please</t