gpt4 book ai didi

javascript - 文件上传到 azure 文件共享不适用于更大的文件

转载 作者:行者123 更新时间:2023-12-03 01:22:56 24 4
gpt4 key购买 nike

我正在尝试使用此 @azure/storage-file-share Node Js 客户端库将大文件(0 到 100mb)上传到 azure 文件共享。

小于 4 MB 的小文件效果很好,但更多会引发错误(contentLength 必须 > 0 且 <= 4194304 字节)

我的有效负载位于可读流中,并且我正在库中使用方法 uploadRange

下面是代码

{
method: "POST",
path: `${apiBase}/mount`,
config: {
description: "uploadFile",
tags: ["api", "file"],
notes: ["upload a file"],
auth: {
strategy: "jwt",
mode: options.session.auth,
access: {
scope: options.session.scope,
},
},
payload: {
maxBytes: 1024 * 1024 * 200,
multipart: true,
parse: true,
output: "stream",
allow: "multipart/form-data",
},
timeout: {
server: 10 * 60 * 1000,
socket: 12 * 60 * 1000,
},

response: {
status: {
200: Joi.object({
status: Joi.string(),
fileUrl: Joi.string(),
date: Joi.number(),
}),
422: Joi.object({
statusCode: Joi.number().integer(),
error: Joi.string(),
message: Joi.string(),
}),
503: Joi.object({
statusCode: Joi.number().integer(),
error: Joi.string(),
message: Joi.string(),
}),
},
},
handler: async (request, h) => {
if (!request.auth.credentials) {
throw Boom.unauthorized("unexpected unauthorized error");
}
try {
const azureDirectory = azure.sanitizeContainerName(
request.auth.credentials.userId
);
const azureFileStream = request.payload.file;
const r = await azure.uploadFileToVolume({
azureFileServiceClient: options.azureFileServiceClient,
azureFileVolumeMount: options.azureFileVolumeMount,
azureFileStream,
azureDirectory,
});
if (r.errorCode) {
throw Boom.badData(
`file upload error due to azure error ${r.errorCode}` +
`\n${JSON.stringify(r)}`
);
}

return h.response({
status: "ok",
fileUrl:
options.azureFileServiceClient.url +
azureDirectory +
// encode file name
`/${encodeURIComponent(azureFileStream.hapi.filename)}`,
date: new Date(r.lastModified).getTime(),
});
} catch (e) {
throw Boom.serverUnavailable(`file upload error ${e}`);
}
},
},
}


exports.uploadFileToVolume = async ({
azureFileServiceClient,
azureFileVolumeMount,
azureFileStream,
azureDirectory,
}) => {
const directoryClient = await azureFileServiceClient
.getShareClient(azureFileVolumeMount)
.getDirectoryClient(azureDirectory);

if (!(await directoryClient.exists())) {
// create azure directory by userid if not exists
await azureFileServiceClient
.getShareClient(azureFileVolumeMount)
.createDirectory(azureDirectory);
}

const content = azureFileStream._data;
const fileName = encodeURIComponent(azureFileStream.hapi.filename);
const fileClient = directoryClient.getFileClient(fileName);
await fileClient.create(content.length);

return await fileClient.uploadRange(content, 0, content.length);

};

任何人都可以帮助我在库中找到正确的方法来发送文件,我尝试使用 uploadStream 但它不起作用。

最佳答案

您收到此错误的原因是 uploadRange 允许的最大内容大小为 4MB。 uploadRange 操作映射到 Put Range REST API 操作和限制来自 REST API 端(请参阅请求 header 部分中的 Range 或 x-ms-range 说明)。

您要做的就是读取内容 block ,然后使用这些 block 重复调用 uploadRange 方法。读取 chunk 时,必须保证读取的 chunk 最大大小不超过 4MB。

关于javascript - 文件上传到 azure 文件共享不适用于更大的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68309059/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com