Questo è un esempio funzionante che sto utilizzando. Ma in qualche modo (forse solo nel mio caso) questo può essere molto lento.
//== 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);
};
}());
fonte
2015-06-21 14:16:41
Mi sono spesso chiesto perché i file di flusso dal server al client attraverso un webSocket quando http ha un sacco di supporto del protocollo per questo. È possibile utilizzare il webSocket per attivare un download dando al client un URL, ma poi richiedere al client un normale flusso http di tale URL piuttosto che farlo tramite webSockets. In questo modo, si mantiene il webSocket come sistema di notifica e si utilizzano protocolli di streaming più tradizionali su http per i grandi download. – jfriend00
Cosa dice jfriend00 – chickenchilli