使用
fetch
方法来上传文件相当容易。
连接断开后如何恢复上传?这里没有对此的内建选项,但是我们有实现它的一些方式。
对于大文件(如果我们可能需要恢复),可恢复的上传应该带有上传进度提示。由于
fetch
不允许跟踪上传进度,我们将会使用
XMLHttpRequest
。
不太实用的进度事件
要恢复上传,我们需要知道在连接断开前已经上传了多少。
我们有
xhr.upload.onprogress
来跟踪上传进度。
不幸的是,它不会帮助我们在此处恢复上传,因为它会在数据 被发送 时触发,但是服务器是否接收到了?浏览器并不知道。
或许它是由本地网络代理缓冲的(buffered),或者可能是远程服务器进程刚刚终止而无法处理它们,亦或是它在中间丢失了,并没有到达服务器。
这就是为什么此事件仅适用于显示一个好看的进度条。
要恢复上传,我们需要 确切地 知道服务器接收的字节数。而且只有服务器能告诉我们,因此,我们将发出一个额外的请求。
首先,创建一个文件 id,以唯一地标识我们要上传的文件:
xhr.upload.onprogress = (e) => { console.log(`Uploaded ${startByte + e.loaded} of ${startByte + e.total}`); // 文件可以是来自 input.files[0],或者另一个源 xhr.send(file.slice(startByte));