文件上传到 azure 文件共享不适用于更大的文件

Posted

技术标签:

【中文标题】文件上传到 azure 文件共享不适用于更大的文件【英文标题】:file upload to azure file share not working with bigger file 【发布时间】:2021-09-19 08:36:49 【问题描述】:

我正在尝试使用此 @azure/storage-file-share 节点 Js 客户端库将大文件(0 到 100mb)上传到 azure 文件共享。

小于 4 MB 的小文件效果很好,但更多的是引发错误(contentLength 必须 > 0 且

我的有效负载在可读流中,并且我在库中使用方法 uploadRange

下面是代码


        method: "POST",
        path: `$apiBase/mount`,
        config: 
          description: "uploadFile",
          tags: ["api", "file"],
          notes: ["upload a file"],
          auth: 
            strategy: "jwt",
            mode: options.session.auth,
            access: 
              scope: options.session.scope,
            ,
          ,
          payload: 
            maxBytes: 1024 * 1024 * 200,
            multipart: true,
            parse: true,
            output: "stream",
            allow: "multipart/form-data",
          ,
          timeout: 
            server: 10 * 60 * 1000,
            socket: 12 * 60 * 1000,
          ,

          response: 
            status: 
              200: Joi.object(
                status: Joi.string(),
                fileUrl: Joi.string(),
                date: Joi.number(),
              ),
              422: Joi.object(
                statusCode: Joi.number().integer(),
                error: Joi.string(),
                message: Joi.string(),
              ),
              503: Joi.object(
                statusCode: Joi.number().integer(),
                error: Joi.string(),
                message: Joi.string(),
              ),
            ,
          ,
          handler: async (request, h) => 
            if (!request.auth.credentials) 
              throw Boom.unauthorized("unexpected unauthorized error");
            
            try 
              const azureDirectory = azure.sanitizeContainerName(
                request.auth.credentials.userId
              );
              const azureFileStream = request.payload.file;
              const r = await azure.uploadFileToVolume(
                azureFileServiceClient: options.azureFileServiceClient,
                azureFileVolumeMount: options.azureFileVolumeMount,
                azureFileStream,
                azureDirectory,
              );
              if (r.errorCode) 
                throw Boom.badData(
                  `file upload error due to azure error $r.errorCode` +
                    `\n$JSON.stringify(r)`
                );
              

              return h.response(
                status: "ok",
                fileUrl:
                  options.azureFileServiceClient.url +
                  azureDirectory +
                  // encode file name
                  `/$encodeURIComponent(azureFileStream.hapi.filename)`,
                date: new Date(r.lastModified).getTime(),
              );
             catch (e) 
              throw Boom.serverUnavailable(`file upload error $e`);
            
          ,
        ,
      
      
      
exports.uploadFileToVolume = async (
  azureFileServiceClient,
  azureFileVolumeMount,
  azureFileStream,
  azureDirectory,
) => 
  const directoryClient = await azureFileServiceClient
    .getShareClient(azureFileVolumeMount)
    .getDirectoryClient(azureDirectory);

  if (!(await directoryClient.exists())) 
    // create azure directory by userid if not exists
    await azureFileServiceClient
      .getShareClient(azureFileVolumeMount)
      .createDirectory(azureDirectory);
  

  const content = azureFileStream._data;
  const fileName = encodeURIComponent(azureFileStream.hapi.filename);
  const fileClient = directoryClient.getFileClient(fileName);
  await fileClient.create(content.length);

  return await fileClient.uploadRange(content, 0, content.length);

;

谁能帮我在库中找到正确的方法来发送文件,我尝试使用uploadStream但它不起作用。

【问题讨论】:

【参考方案1】:

您收到此错误的原因是uploadRange 允许的最大内容大小为 4MB。 uploadRange 操作映射到 Put Range REST API 操作,限制来自 REST API 端(请参阅请求标头部分中Range or x-ms-range 的描述)。

您需要做的是读取您的内容块,然后使用这些块重复调用uploadRange 方法。读取chunk时,必须保证读取的chunk最大大小不超过4MB。

【讨论】:

一个可以帮助您创建 javascript 版本的 c# 示例***.com/a/64031613/74585

以上是关于文件上传到 azure 文件共享不适用于更大的文件的主要内容,如果未能解决你的问题,请参考以下文章

基于身份的身份验证不适用于 Azure 存储文件共享

当文件上传到 azure 文件共享时,如何添加触发器以将文件从 azure 文件共享移动到 azure blob?

无法将文件上传到 Azure 文件共享

将文件上传到 Azure 存储文件共享的脚本

将 base64 上传到 azure 文件共享

我们可以在 .net core 3.1 中一次性上传多少大文件到 Azure 文件共享