【发布时间】:2021-12-10 13:20:10
【问题描述】:
我正在使用 Node.js 和 Azure SDK v12。我想复制具有访问层==='Archive 的现有 blob。为此,我想复制 blob 并将其写入具有不同 blob 名称和更改(重新水化)访问层的同一容器。
我可以直接更改现有“存档”blob 的访问层,但这不是我的目标。我想保留访问层为“存档”的 blob,并创建一个访问层==="Cool 的新 blob " || "热"。
我正在按照文档 (https://docs.microsoft.com/en-us/azure/storage/blobs/archive-rehydrate-overview) 进行操作。
如果 blob 具有访问层==='Cool' ||,则以下代码有效'热的'。但是,对于访问层 ==='Archive' 的 blob,它会失败。
另外:我认为 SDK 的“syncCopyFromUrl”和“beginCopyFromUrl”不适用于复制访问层 ===“存档”的 blob。如果我尝试这样做,我会收到以下错误:对于“syncCopyFromUrl”,它给了我:“在存档的 blob 上不允许执行此操作。”对于“beginCopyFromUrl”,它给了我:“复制源 blob 已被修改” - 当我检查时,该 blob 没有被修改(我检查最后修改日期,它是过去的)。
如何复制存档的 blob 并将新 blob 保存在具有不同访问类型的同一容器中
const { BlobServiceClient,generateBlobSASQueryParameters, BlobSASPermissions } = require("@azure/storage-blob");
export default async (req, res) => {
if (req.method === 'POST') {
const connectionString = 'DefaultEndpointsProtocol=...'
const containerName = 'container';
const srcFile='filename' // this is the filename as it appears on Azure portal (i.e. the blob name)
async function getSignedUrl(blobClient, options={}){
options.permissions = options.permissions || "racwd"
const expiry = 3600;
const startsOn = new Date();
const expiresOn = new Date(new Date().valueOf() + expiry * 1000);
const token = await generateBlobSASQueryParameters(
{
containerName: blobClient.containerName,
blobName: blobClient.name,
permissions: BlobSASPermissions.parse(options.permissions),
startsOn, // Required
expiresOn, // Optional
},
blobClient.credential,
);
return `${blobClient.url}?${token.toString()}`;
}
(async () => {
try {
const blobServiceClient = BlobServiceClient.fromConnectionString(connectionString);
const containerClient = blobServiceClient.getContainerClient(containerName);
const sourceBlobClient = containerClient.getBlockBlobClient(srcFile);
const targetBlobClient = containerClient.getBlockBlobClient('targetFileName');
const url = await getSignedUrl(sourceBlobClient);
console.log(`source: ${url}`);
const result = await targetBlobClient.syncCopyFromURL(url);
// const result = await targetBlobClient.beginCopyFromURL(url);
console.log(result)
} catch (e) {
console.log(e);
}
})();
}
}
export const config = {
api: {
bodyParser: {
sizeLimit: '1gb',
},
},
}
【问题讨论】:
标签: node.js azure sdk copy blob