前端文件上传的一些血泪教训总结

56 阅读3分钟

作为一名前端开发,本前端仔日常负责公司的小程序端、桌面端及后台网页端等多个平台。在这些不同端的开发过程中,文件的上传、保存等交互操作总是绕不开的话题,而我也确实踩了不少坑。

因此,希望通过这篇文章总结一些经验,也帮助大家尽量避开这些“雷区”。


1. 永远不要相信用户端的文件名——这里的坑比你想象中要多

在我处理文件相关逻辑时,最深刻的教训之一就是:永远不要直接使用客户端传来的文件名

下面分享两个真实踩坑经历:

微信小程序中的“奇葩”Bug:

我们的小程序使用 wx.chooseMessageFile 接口,让用户从聊天会话中选择文件,之后我们会处理这些文件并保存到本地。结果最近接连遇到两个问题:

  • 在 vivo 手机上,接口返回的图片文件名中竟然包含 //,例如 SERVERID://123xxxx。由于我最初是直接用这个文件名作为保存路径,结果系统把 // 识别为路径分隔符,导致文件保存路径错误。
  • 在 华为鸿蒙 5.1 系统中,返回的文件名居然是空字符串!你没看错,就是空字符串。这直接导致多个文件在保存时指向同一个路径,造成文件被覆盖。

由于我没有vivo手机和华为纯血鸿蒙手机,上述的bug排查是从日志中发现的,评论区有木有小伙伴现身说法一下的,是不是也遇到这个问题。

经验总结:

  • 文件名中可能含有非法字符(如 /、`` 等),直接使用会导致路径解析错误。
  • 文件名也可能为空或重复,造成文件被意外覆盖。
  • 最佳做法:保存文件时,不要使用原始文件名作为存储路径。建议使用随机生成的字符串(如 UUID)作为文件名,同时将原始文件名保存在另一个变量中,用于界面展示。这样既安全又不影响用户体验。

2. 上传时,客户端的时间是不可靠的

文件上传时我们常常会用到与时间相关的参数,比如生成签名或密钥。然而,客户端的时间是不可信的。用户可能修改了系统时间,造成与服务器时间有较大偏差,从而导致签名错误、上传失败。

如果后端支持,最佳方案是请后端提供一个接收文件上传的接口,由后端生成签名或处理时间相关逻辑。如果后端不方便配合,那前端就必须通过接口获取服务器时间,确保时间参数的准确性。


希望这些总结能对大家有所启发。如果你也在文件处理中踩过类似的坑,欢迎一起交流讨论。