我需要将文件从一个客户端浏览器发送到另一个浏览器,而无需将其保存在服务器 (node.js) 上 我如何使用 HTML5 和 File API 来做到这一点?
实际上实施的解决方案:
最终解决方案如下所示:
在播种客户端从输入 [type=file] 获取文件
文件数组包含一个存储文件对象的密钥。使用 slice/mozSlice 方法将其拆分为块,以便 Object.slice 将返回 Blob 对象。
使用 FileReader Blob 可以读入原始二进制数据或 base64 编码数据。FileReader 实现 readAsDataURL(blob) 以读取 base64 和 readAsBinaryString(blob) 以读取原始二进制数据。请参阅 'onloadend' FileReader 事件以访问从 blob 读取的数据。
您应该实现逻辑以根据块大小(通常为 1024 * 64)和下一个切片开始/停止位置计算块数以获得完全相同大小的块
编码数据通过 socket.io 发送到 node.js,其中唯一的服务器端逻辑是将接收到的数据发送到也通过 socket.io 连接的 pear
猜猜最有趣的是将所有这些块放在 pear 客户端浏览器上的 blob 中。从原始二进制数据创建 Blob 将导致错误大小的 blob 并导致错误的文件大小。这就是我们从播种机传输 base64 编码数据的原因。
解码可能会成为问题,因为我们必须自己实现它。function decode64 (data) { var mimeString = data.split(',')[0].split(':')[1].split(';')[0], // remove all chars before ',' byteString = atob(data.split(',')[1]), // if BlobBuilder available ab = new ArrayBuffer(byteString.length), ia = new Uint8Array(ab); for (var i = 0; i < byteString.length; i++) { ia[i] = byteString.charCodeAt(i); } blob = new Blob([ia], {'type' : (mimeString) }); return blob; }
将数据解码为 blob 后,我们必须将其推送到包含另一个解码块的数组。7. 从解码为 blob 的块数组创建一个 Blob,像这样
new Blob (array_of_decoded_blobs_returned_by_decode64_function, {type:'mime-type'})
使用文件 api 将 blob 写入文件或做任何你想做的事情