blob 存储到 fileShare 大文件传输的问题:使用 fileRangenodejs Cloud 功能它传输部分文件

问题描述

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

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

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

代码片段:

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

传输部分文件后会报错 - 任何建议:我们如何使用 rangeSize 传输大文件
堆栈:RangeError:contentLength 必须 > 0 且

解决方法

如果只想将一些文件从 Azure blob 存储传输到 Azure 文件共享,可以在服务器端生成带有 SAS token 的 blob URL,并使用 startCopyFromURL 函数让您的文件share 复制此文件,而不是从 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")})

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

enter image description here

enter image description here 我复制了一个大约 11 MB 的文件,它花费了大约 5 秒。