使用 WebSocket 上传大文件 [英] Large file upload with WebSocket

查看:16
本文介绍了使用 WebSocket 上传大文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 WebSocket API 上传大文件(至少 500MB,最好是几 GB).问题是我不知道如何编写发送文件的这一部分,释放使用的资源然后重复".我希望我可以避免为此使用 Flash/Silverlight 之类的东西.

I'm trying to upload large files (at least 500MB, preferably up to a few GB) using the WebSocket API. The problem is that I can't figure out how to write "send this slice of the file, release the resources used then repeat". I was hoping I could avoid using something like Flash/Silverlight for this.

目前,我正在处理以下方面的工作:

Currently, I'm working with something along the lines of:

function FileSlicer(file) {
    // randomly picked 1MB slices,
    // I don't think this size is important for this experiment
    this.sliceSize = 1024*1024;  
    this.slices = Math.ceil(file.size / this.sliceSize);

    this.currentSlice = 0;

    this.getNextSlice = function() {
        var start = this.currentSlice * this.sliceSize;
        var end = Math.min((this.currentSlice+1) * this.sliceSize, file.size);
        ++this.currentSlice;

        return file.slice(start, end);
    }
}

然后,我会使用:

function Uploader(url, file) {
    var fs = new FileSlicer(file);
    var socket = new WebSocket(url);

    socket.onopen = function() {
        for(var i = 0; i < fs.slices; ++i) {
            socket.send(fs.getNextSlice()); // see below
        }
    }
}

基本上这会立即返回,bufferedAmount 不变(0),并且在尝试发送之前不断迭代并将所有切片添加到队列中;没有 socket.afterSend 可以让我正确排队,这就是我卡住的地方.

Basically this returns immediately, bufferedAmount is unchanged (0) and it keeps iterating and adding all the slices to the queue before attempting to send it; there's no socket.afterSend to allow me to queue it properly, which is where I'm stuck.

推荐答案

网络世界、浏览器、防火墙、代理,自从做出这个回答后发生了很大的变化.现在,使用 websockets 发送文件可以有效地完成,尤其是在局域网上.

Websockets 对于双向通信非常有效,尤其是当您有兴趣从服务器推送信息(最好是小)时.它们充当双向套接字(因此得名).

Websockets are very efficient for bidirectional communication, especially when you're interested in pushing information (preferably small) from the server. They act as bidirectional sockets (hence their name).

Websockets 看起来不是在这种情况下使用的正确技术.特别是考虑到使用它们会增加与某些代理、浏览器 (IE) 甚至防火墙的不兼容.

Websockets don't look like the right technology to use in this situation. Especially given that using them adds incompatibilities with some proxies, browsers (IE) or even firewalls.

另一方面,上传文件只是向服务器发送一个 POST 请求,文件在正文中.浏览器在这方面非常擅长,大文件的开销几乎为零.不要将 websockets 用于该任务.

On the other end, uploading a file is simply sending a POST request to a server with the file in the body. Browsers are very good at that and the overhead for a big file is really near nothing. Don't use websockets for that task.

这篇关于使用 WebSocket 上传大文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆