node.js - 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 字节
解决方案
如果您只想将一些文件从 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")})
我已经在我的存储帐户中进行了测试,结果:
推荐阅读
- vba - 使用VBA抓取网页中的span标签
- java - 有没有一种方法可以从 Material Design Picker 中初始显示 Mobile Input Picker?
- php - GravityForms 基于 ACF 帖子类型字段预填充字段值 - 动态
- python - NLTK 和 Pandas - 将同义词添加到列表中
- xml - 如何使用 Xpath 定位子节点不包含属性的父节点?
- python - 如何使用加密密钥建立安全的 ldap 连接?
- javascript - Jquery 加载返回 [object object]
- ios - WKWebView 进程在 CI 中终止但不在本地
- lit-element - 有没有办法让 lit-html 模板中的标签动态化?
- c - 计算文件中的字母“s”和“S”