问题描述
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")})
我已经在我的存储帐户中进行了测试,结果: