यह एक कामकाजी उदाहरण है जिसका मैं उपयोग कर रहा हूं। लेकिन किसी भी तरह (शायद केवल मेरे मामले में) यह बहुत धीमा हो सकता है।
//== 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);
};
}());
स्रोत
2015-06-21 14:16:41
मैंने अक्सर सोचा है कि सर्वर से सर्वर से क्लाइंट को सर्वर सॉफ़्टवेयर के माध्यम से स्ट्रीम क्यों करता है जब http के लिए प्रोटोकॉल समर्थन लोड होता है। आप क्लाइंट को यूआरएल देकर डाउनलोड ट्रिगर करने के लिए वेबसाकेट का उपयोग कर सकते हैं, लेकिन फिर क्लाइंट वेबसाकेट्स पर ऐसा करने के बजाए उस यूआरएल की नियमित http स्ट्रीम का अनुरोध करता है। इस तरह, आप वेबसाकेट को अधिसूचना प्रणाली के रूप में मुक्त रखते हैं और बड़े डाउनलोड के लिए http पर अधिक पारंपरिक स्ट्रीम प्रोटोकॉल का उपयोग करते हैं। – jfriend00
क्या jfriend00 कहता है – chickenchilli