标准答案

  1. 请求体大小、单文件大小、文件数量、上传时长和最小传输速率都应有限制,避免慢速上传和资源长期占用。
  2. 服务端应以流的方式把数据写入临时存储或对象存储,利用背压控制读取速度,而不是先聚合成完整字节数组。
  3. 流式处理仍要校验认证、授权、总大小、内容类型、文件签名和病毒扫描策略,不能因为数据分块就跳过安全边界。
  4. 客户端断开、校验失败或下游存储失败时,要关闭流、删除临时对象并记录可追踪的失败状态。
  5. 生产环境还要考虑磁盘配额、对象存储分片、代理缓冲、超时、重试和上传完成后的异步处理。

题目解析

流式上传把内存占用从“文件大小乘并发数”降低为受控缓冲区,但磁盘、网络、对象存储和扫描队列仍可能成为瓶颈。

文件名和 Content-Type 都来自不可信客户端。存储路径、下载响应和后续解析器同样需要防护。

代码示例

上传处理应在数据仍是流时就施加大小限制和错误清理,而不是在读取完整文件后再判断。

TypeScript
let received = 0
for await (const chunk of request.body) {
  received += chunk.length
  if (received > maxBytes) throw new Error("file too large")
  await objectStore.writeChunk(uploadId, chunk)
}

await objectStore.complete(uploadId)

常见误区

  • 用内存缓冲接收所有文件,再在业务层判断大小。
  • 只校验扩展名或请求头 Content-Type。
  • 上传失败后不清理临时文件和未完成对象。

作者信息