标准答案
- 请求体大小、单文件大小、文件数量、上传时长和最小传输速率都应有限制,避免慢速上传和资源长期占用。
- 服务端应以流的方式把数据写入临时存储或对象存储,利用背压控制读取速度,而不是先聚合成完整字节数组。
- 流式处理仍要校验认证、授权、总大小、内容类型、文件签名和病毒扫描策略,不能因为数据分块就跳过安全边界。
- 客户端断开、校验失败或下游存储失败时,要关闭流、删除临时对象并记录可追踪的失败状态。
- 生产环境还要考虑磁盘配额、对象存储分片、代理缓冲、超时、重试和上传完成后的异步处理。
题目解析
流式上传把内存占用从“文件大小乘并发数”降低为受控缓冲区,但磁盘、网络、对象存储和扫描队列仍可能成为瓶颈。
文件名和 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。
- 上传失败后不清理临时文件和未完成对象。