您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

使用socket.io-stream将文件从服务器流传输到客户端

使用socket.io-stream将文件从服务器流传输到客户端

这是我正在使用的工作示例。但是以某种方式(也许仅以我为例),这可能会非常缓慢。

//== Server Side
ss(socket).on('filedownload', function (stream, name, callback) {

    //== Do stuff to find your file
    callback({
        name : "filename",
        size : 500
    });

    var MyFileStream = fs.createReadStream(name);
    MyFileStream.pipe(stream);

});

//== Client Side
/** Download a file from the object store
 * @param {string} name Name of the file to download
 * @param {string} originalFilename Overrules the file's originalFilename
 * @returns {$.Deferred}
 */
function downloadFile(name, originalFilename) {

    var deferred = $.Deferred();

    //== Create stream for file to be streamed to and buffer to save chunks
    var stream = ss.createStream(),
    fileBuffer = [],
    fileLength = 0;

    //== Emit/Request
    ss(mysocket).emit('filedownload', stream, name, function (fileError, fileInfo) {
        if (fileError) {
            deferred.reject(fileError);
        } else {

            console.log(['File Found!', fileInfo]);

            //== Receive data
            stream.on('data', function (chunk) {
                fileLength += chunk.length;
                var progress = Math.floor((fileLength / fileInfo.size) * 100);
                progress = Math.max(progress - 2, 1);
                deferred.notify(progress);
                fileBuffer.push(chunk);
            });

            stream.on('end', function () {

                var filedata = new Uint8Array(fileLength),
                i = 0;

                //== Loop to fill the final array
                fileBuffer.forEach(function (buff) {
                    for (var j = 0; j < buff.length; j++) {
                        filedata[i] = buff[j];
                        i++;
                    }
                });

                deferred.notify(100);

                //== Download file in browser
                downloadFileFromBlob([filedata], originalFilename);

                deferred.resolve();
            });
        }
    });

    //== Return
    return deferred;
}

var downloadFileFromBlob = (function () {
    var a = document.createElement("a");
    document.body.appendChild(a);
    a.style = "display: none";
    return function (data, fileName) {
        var blob = new Blob(data, {
                type : "octet/stream"
            }),
        url = window.URL.createObjectURL(blob);
        a.href = url;
        a.download = fileName;
        a.click();
        window.URL.revokeObjectURL(url);
    };
}());
其他 2022/1/1 18:14:16 有762人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶