
较大的商品图下载到一半中断,重新连接后文件反而打不开,未必是生成结果坏了。自建下载程序如果把一次完整响应接到旧片段后面,文件体积可能增加,内容却已经拼错。这里讨论的是已授权文件的下载恢复,不讨论重新生图,也没有核验某个图像服务一定支持断点续传。
先区分图像任务与文件传输。生成任务是否完成,要查询原任务;已完成的文件没有下载完,则是另一个问题。重新提交生成请求会产生新的输出,不能代替恢复原文件。对需要留存采用版本的商品素材来说,下载程序应围绕同一份表示继续工作,而不是看到网络错误就自动再造一张图。
HTTP范围请求允许客户端请求资源的一部分。MDN用Range与206响应解释这种交互,并指出Content-Range说明返回片段在完整资源中的位置。1 假设已经可靠保存前4096个字节,下一次可以请求从偏移4096开始的部分;这是一个人为设定的字节例子,不是图片尺寸,也不能把4096误当成图像的宽度。
关键在于服务端可能返回什么。收到206以后,先检查Content-Range的起点是否与本地片段末尾相接,再考虑追加。若返回200,它可能是完整文件响应,不能把整个正文直接接到旧片段后面。若是416,则要核对本地长度、目标资源长度和版本信息,不能仅凭"已经没有剩余范围"就把本地文件宣布为完整。

AI生成概念视觉,不代表商品实拍或产品实测。
更隐蔽的情况是地址没变,内容已经换过。上午保存的片段来自一个版本,下午继续请求的剩余部分却来自另一个版本,字节范围看似接得上,也不代表两段能够组成同一张图片。恢复记录因此不能只有文件路径与已下载长度,还应保存能够确认表示版本的信息,并在恢复时使用对应的条件请求。
RFC 9110规定了If-Range:条件满足时处理范围请求,不满足时返回完整表示;其中实体标签不能使用弱验证器。2 因而不能把带W/前缀的弱ETag原样当作强版本凭据使用,也不能随意从文件名里拼出一个标签。这里仅介绍协议要求,实际下载器要根据服务端确实返回的验证器决定是否支持恢复。
一个清楚的处理流程是先保留旧片段,再分别处理响应:符合预期的206进入范围与版本核对;200写入新的临时文件,完整验证后再替换;416进入状态核对。遇到无法确认版本或位置的响应,就保留记录并停止自动拼接。不要为了让进度条继续走,把所有成功状态码都当成可以追加的数据。
还要留意字节坐标对应哪一种表示。自动解压、转码或中间服务变换内容后,本地文件长度可能已不再对应原来请求的字节范围。实现恢复时应统一保存的字节形式和请求条件,不能用已经解压后的长度去推算压缩表示的后续偏移。对于不受自己控制的下载链路,选择重新完整下载同一已完成文件,往往比猜测如何拼接更可检查。
传输结束也应分两步验证。长度与响应信息相符,是传输层面的核对;文件能够被图像解码器完整读取、实际宽高与交付记录相符,是文件层面的核对。两者都不自动证明画面内容正确。商品的文字、结构和采用版本仍要与审过的原图对应,不能因为程序返回成功就跳过图片本身。
Picset公开工作室提供图片输入、输出比例和清晰度等制作选项。3 这些页面选项描述制作条件,并不说明下载端支持哪些HTTP恢复行为。若需要把输出保存到自己的素材目录,应先保留原任务及采用结果,再单独验证实际下载接口;本文没有发起额外生成,也不把标准协议的能力归到某个未经测试的服务上。
排查时留下状态码、范围字段、采用的验证器、写入方式与验证结果,敏感下载地址和凭据不放进公开报告。这样下一次出错能判断是原文件发生变化、服务端忽略范围,还是客户端追加逻辑有误。恢复的目标是得到同一份完整原图,而不是让一个不断变大的文件看起来像下载完成。
参考资料 1 MDN:HTTP范围请求:developer.mozilla.org/en-US/docs/... 2 RFC 9110:HTTP Semantics,第13.1.5与14节:www.rfc-editor.org/rfc/rfc9110... 3 Picset电商套图:picsetai.cn/studio-gene...