保存下来的文件还不等于已验证的下载
在发布或使用之前,请确认经由代理的下载包含预期文件,而不是登录页或不完整的响应。
假设有一个 8 KB 的 report.xlsx,打开后却是登录页。程序成功保存了一个文件,却始终没有拿到预期的电子表格。文件名是在本地选定的,并不能证明实际到达的是什么。
在发布临时下载之前,把验收做成独立的一步:
- 要求传输成功并符合预期的响应状态。 要保留错误,而不是把它之前写入的字节当作完整内容。
- 将内容与预期的文件类型进行比对。 登录页或过滤页也可能返回 200。Content-Type 可能不正确,而电子表格里出现 HTML 前缀是需要排查的警告。若文件以 HTTP 状态行开头,则更可能说明响应被原样转发。
- 在可获取时,用可信的校验和或签名验证全部已保存的字节。 只有通过必要检查之后,应用才应发布或使用最终文件。
没有预期值而计算哈希,只能标识你收到的字节。经由同一条不可信路径取得的未签名校验和,可能带有与该文件相同的弱点;应使用独立可信的预期值。
比较大小也要小心。HTTP 客户端在读取时可能会解码内容编码,因此所得文件长度与描述编码后报文的头部之间出现差异是合理的。请把发布方的预期与实际保存下来的表示形式相比较。
如果某次尝试失败,临时输出只应为有意续传而保留,否则就丢弃。把不完整的字节留在最终路径上,会迫使下一个程序去猜测它们是否可用。