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

我已经成功地将文件从客户端上传到服务器,但现在我想实现相反的方式。 不幸的是,这个部分缺less官方模块页面上的文档。

我想要做到以下几点:

  • 用文件名发送stream和“下载”事件到服务器
  • 服务器应该创build一个readstream并将其传递给从客户端发出的stream
  • 当客户端到达stream时,会出现一个下载popup窗口并询问文件的保存位置

我不想使用简单的文件超链接的原因是混淆:服务器上的文件被encryption和重命名,所以我必须解密并重命名为每个下载请求。

任何代码片段,让我开始呢?

这是我正在使用的一个工作示例。 但不知何故(也许只是在我的情况下),这可能是非常缓慢的。

//== 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); }; }());