2

我需要将文件从一个客户端浏览器发送到另一个浏览器,而无需将其保存在服务器 (node.js) 上 我如何使用 HTML5 和 File API 来做到这一点?

实际上实施的解决方案:

最终解决方案如下所示:

  1. 在播种客户端从输入 [type=file] 获取文件

  2. 文件数组包含一个存储文件对象的密钥。使用 slice/mozSlice 方法将其拆分为块,以便 Object.slice 将返回 Blob 对象。

  3. 使用 FileReader Blob 可以读入原始二进制数据或 base64 编码数据。FileReader 实现 readAsDataURL(blob) 以读取 base64 和 readAsBinaryString(blob) 以读取原始二进制数据。请参阅 'onloadend' FileReader 事件以访问从 blob 读取的数据。

  4. 您应该实现逻辑以根据块大小(通常为 1024 * 64)和下一个切片开始/停止位置计算块数以获得完全相同大小的块

  5. 编码数据通过 socket.io 发送到 node.js,其中唯一的服务器端逻辑是将接收到的数据发送到也通过 socket.io 连接的 pear

  6. 猜猜最有趣的是将所有这些块放在 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 写入文件或做任何你想做的事情

4

2 回答 2

2

Websockets 是我能想到的唯一方法,你仍然需要一个服务器端代理。

请参阅:Websockets 是否允许 p2p(浏览器到浏览器)通信?

于 2013-02-28T21:14:35.783 回答
1

查看webrtc。您可以直接将文件发送到浏览器。服务器只告诉一个客户端浏览器另一个客户端浏览器的“地址”。

于 2013-09-11T08:52:33.947 回答