将大型zip文件上传到Azure存储会损坏文件

时间:2019-05-10 18:38:08

标签: node.js angular express azure-storage

使用带有Node的Express将约800mb的zip文件上传到Azure存储。我正在使用'azure-storage'软件包(https://www.npmjs.com/package/azure-storage)连接并上传/下载到Azure存储。 该文件通过Angular应用程序上传,分成10mb,然后传递到Node应用程序。我尝试了以下方法:

  1. 获取Node上的所有块(作为字节流),将它们合并到单个zip文件中(我已确认创建的zip文件正确)并存储在本地。然后,我将合并的文件上传到Azure存储。这种方法的问题是:
    • 当我将其另存为Azure上的文件时,正在存储文件,但是如果文件大小为100mb +,则不会保持zip文件的完整性。文件大小正确,但下载时它们不会解压缩(适用于小文件大小)
    const azure = require('azure-storage');
    const blobService = azure.createBlobService(<STORAGE_ACCOUNT>, <STORAGE_ACCESS_KEY>);
    const fileService = azure.createFileServiceazure.createBlobService(<STORAGE_ACCOUNT>, <STORAGE_ACCESS_KEY>);

    fileService.createShareIfNotExists(
        <task_name>,
        (error, result, response) => {
          if (!error) {
            fileService.createDirectoryIfNotExists(
              <task_name>,
              <directory_name>,
              (error, result, response) => {
                if (!error) {
                  fileService.createFileFromLocalFile(
                    <task_name>,
                    <directory_name>,
                    <file_name>,
                    <path_to_local_file>,
                    (error, result, response) => {
                      if (!error) {
                        res.status(200).json({message: "Uploaded"});
                      } else {
                        console.log(error);
                      }
                    });
                }
              });
          }
    });
  • 当我将其另存为Azure上的Blob时,大文件根本不会上传,而小文件可以正常工作
    blobService.createContainerIfNotExists(
      <container_name>,
      {publicAccessLevel: 'blob'},
      (error, result, response) => {
        if (!error) {
          blobService.createBlockBlobFromLocalFile(
            <container_name>,
            <blob_name>,
            <path_to_local_file>,
            (error, result, response) => {
              if (!error) {
                res.status(200).json({message: "Uploaded"});
              } else {
                console.log(error);
              }
            });
        }
      });
  1. 如上所述将大块合并到单个文件中之后,我创建了一个读取流并将其传递给Azure。结果与上面的相同-适用于小文件,但不适用于大文件
    fileService.createShareIfNotExists(
        <task_name>,
        (error, result, response) => {
          if (!error) {
            fileService.createDirectoryIfNotExists(
              <task_name>,
              <directory_name>,
              (error, result, response) => {
                if (!error) {
                  fileService.createFileFromStream(
                    <task_name>,
                    <directory_name>,
                    <file_name>,
                    <read_stream>,
                    <stream_length>,
                    (error, result, response) => {
                      if (!error) {
                        res.status(200).json({message: "Uploaded"});
                      } else {
                        console.log(error);
                      }
                    }
                  )
              }
            });
        }
    });
  1. 在收到块时将它们存储在Azure上(理想情况下,我想这样做是因为不必在磁盘上创建文件)。第一个块已上传,但后续块未上传
    blobService.createContainerIfNotExists(
      <container_name>,
      {publicAccessLevel: 'blob'},
      (error, result, response) => {
        if (!error) {
          blobService.createAppendBlobFromStream(
            <container_name>,
            <blob_name>,
            <read_stream>,
            <stream_length>,
            (error, result, response) => {
              if (!error) {
                res.status(200).json({message: "Uploaded"});
              } else {
                console.log(error);
              }
            });
        }
      });

我也尝试过createPageBlobFromStream,但是没有运气。

我认为多格式或CORS不会成为问题,因为从本地文件上传对于小型文件而言效果很好。

修改 我能够找到解决我的一个问题的方法- 我只需要增加从前端到后端的请求的“请求超时”, 在控制器中:

exports.uploadToAzure = (req, res, next) => {
    req.setTimeout(5000000); //initially set a high timeout

    //your code with proper error handling

    res.status(200);
};

Azure甚至在上传完成之前也会分配存储中的文件大小。我期望随着文件在Azure上的上传而逐渐增加大小。就我而言,请求在成功上传之前总是会对大型文件超时,这使我认为上传很好(因为大小不错),但已损坏。

但是我仍然无法使用appendFromStream方法在流出现时追加流,并绕过将其保存在磁盘上。关于如何利用该方法有什么想法?谢谢。

0 个答案:

没有答案