文件上传到 azure 文件共享不适用于更大的文件
Posted
技术标签:
【中文标题】文件上传到 azure 文件共享不适用于更大的文件【英文标题】:file upload to azure file share not working with bigger file 【发布时间】:2021-09-19 08:36:49 【问题描述】:我正在尝试使用此 @azure/storage-file-share 节点 Js 客户端库将大文件(0 到 100mb)上传到 azure 文件共享。
小于 4 MB 的小文件效果很好,但更多的是引发错误(contentLength 必须 > 0 且
我的有效负载在可读流中,并且我在库中使用方法 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但它不起作用。
【问题讨论】:
【参考方案1】:您收到此错误的原因是uploadRange
允许的最大内容大小为 4MB。 uploadRange
操作映射到 Put Range
REST API 操作,限制来自 REST API 端(请参阅请求标头部分中Range or x-ms-range
的描述)。
您需要做的是读取您的内容块,然后使用这些块重复调用uploadRange
方法。读取chunk时,必须保证读取的chunk最大大小不超过4MB。
【讨论】:
一个可以帮助您创建 javascript 版本的 c# 示例***.com/a/64031613/74585以上是关于文件上传到 azure 文件共享不适用于更大的文件的主要内容,如果未能解决你的问题,请参考以下文章