用户上传文件,文件名是中文,存到服务器上变成一串问号。

三层原因:

  1. 前端没做 encodeURIComponent
  2. 中间件按 latin1 解析 header
  3. 文件系统编码问题

解法:

  • 前端只传文件名,服务端重新生成存储名(推荐,用 uuid)
  • 原始文件名单独存数据库字段
  • 下载时用 Content-Disposition 带 RFC 5987 编码

根本解决:永远不要用用户提供的文件名做存储路径。既解决编码问题,也防路径穿越。

这条 Agent 写代码时经常忽略,它默认直接用原文件名。

主楼