首页 > 解决方案 > blob 存储到 fileShare 大文件传输的问题:使用 fileRange(nodejs 云功能)。它传输部分文件

问题描述

blob 存储到 fileShare 大文件传输的问题:使用 fileRange(nodejs 云功能)。它传输部分文件。

当我们传输大小为 10MB 的文件时 - 它仅传输 9.7MB 当我们传输大小为 50MB 的文件时 - 它仅传输 49.5MB

它给出的问题是: Stack: RangeError: contentLength must be > 0 and <= 4194304 bytes

代码片段:

const fileName = path.basename('master/test/myTestXml.xml')
const fileClient = directoryClient.getFileClient(fileName);
const fileContent = await streamToString(downloadBlockBlobResponse.readableStreamBody)
await fileClient.uploadRange(fileContent, 0,fileContent.length,{
    rangeSize: 50 * 1024 * 1024, // 4MB range size
    parallelism: 20, // 20 concurrency
    onProgress: (ev) => console.log(ev)
  });

传输部分文件后它给出错误 - 任何建议:我们如何使用 rangeSize 传输大文件。
堆栈:RangeError:contentLength 必须 > 0 且 <= 4194304 字节

标签: node.jsgoogle-cloud-functionsazure-blob-storageblobstorageazure-file-copy

解决方案


如果您只想将一些文件从 Azure blob 存储传输到 Azure 文件共享,您可以在服务器端生成一个带有SAS 令牌的 blob URL,并使用startCopyFromURL函数让您的文件共享复制此文件,而不是从 Azure blob 下载存储并上传到文件共享。它减轻了服务器的压力,并且复制过程很快,因为它使用 Azure 的内部网络。

只需尝试以下代码:

const { ShareServiceClient } = require("@azure/storage-file-share");
const storage = require('azure-storage');

const connStr = "";
const shareName = "";
const sharePath = "";

const srcBlobContainer ="";
const srcBlob="";

const blobService = storage.createBlobService(connStr);

// Create a SAS token that expires in 1 hour
// Set start time to five minutes ago to avoid clock skew.
var startDate = new Date();
startDate.setMinutes(startDate.getMinutes() - 5);
var expiryDate = new Date(startDate);
expiryDate.setMinutes(startDate.getMinutes() + 60);

//grant read permission
permissions = storage.BlobUtilities.SharedAccessPermissions.READ;

var sharedAccessPolicy = {
    AccessPolicy: {
        Permissions: permissions,
        Start: startDate,
        Expiry: expiryDate
    }
};

var srcBlobURL = blobService.getUrl(srcBlobContainer,srcBlob)
var sasToken = blobService.generateSharedAccessSignature(srcBlobContainer, srcBlob, sharedAccessPolicy)
var srcCopyURL = srcBlobURL + "?" + sasToken

const serviceClient = ShareServiceClient.fromConnectionString(connStr);
const fileClient = serviceClient.getShareClient(shareName).getDirectoryClient(sharePath).getFileClient(srcBlob);

fileClient.startCopyFromURL(srcCopyURL).then(function(){console.log("done")})

我已经在我的存储帐户中进行了测试,结果:

在此处输入图像描述

在此处输入图像描述 我复制了一个大约 11 MB 的文件,它花费了大约 5 秒。


推荐阅读