2015-03-15 6 views
5

के साथ सर्वर से क्लाइंट में फ़ाइल स्ट्रीम करना मैंने क्लाइंट से सर्वर पर फ़ाइलों को अपलोड करने में कामयाब रहा है, लेकिन अब मैं विपरीत तरीके से प्राप्त करना चाहता हूं। दुर्भाग्य से ऑफिकल मॉड्यूल पेज पर दस्तावेज़ इस भाग के लिए कमी है।socket.io-stream

  • सर्वर से फ़ाइल नाम
  • सर्वर एक readstream और यह पाइप धारा से उत्सर्जित करने के लिए बनाने चाहिए के साथ एक धारा और 'download' घटना फेंकना:

    मैं निम्नलिखित करना चाहते हैं ग्राहक

  • जब ग्राहक धारा तक पहुँच जाता है, एक डाउनलोड-पॉपअप दिखाई देनी चाहिए और पूछते हैं कि फ़ाइल

कारण है कि मैं का उपयोग नहीं करते चाहते सरल फ़ाइल-हाइपरलिंक को बचाने के लिए obfuscati है ng: सर्वर पर फ़ाइलों को एन्क्रिप्टेड और नामित किया गया है, इसलिए मुझे प्रत्येक डाउनलोड अनुरोध के लिए उन्हें डिक्रिप्ट और नाम बदलना होगा।

मुझे इसके साथ शुरू करने के लिए आसपास के किसी भी कोड स्निपेट?

+0

मैंने अक्सर सोचा है कि सर्वर से सर्वर से क्लाइंट को सर्वर सॉफ़्टवेयर के माध्यम से स्ट्रीम क्यों करता है जब http के लिए प्रोटोकॉल समर्थन लोड होता है। आप क्लाइंट को यूआरएल देकर डाउनलोड ट्रिगर करने के लिए वेबसाकेट का उपयोग कर सकते हैं, लेकिन फिर क्लाइंट वेबसाकेट्स पर ऐसा करने के बजाए उस यूआरएल की नियमित http स्ट्रीम का अनुरोध करता है। इस तरह, आप वेबसाकेट को अधिसूचना प्रणाली के रूप में मुक्त रखते हैं और बड़े डाउनलोड के लिए http पर अधिक पारंपरिक स्ट्रीम प्रोटोकॉल का उपयोग करते हैं। – jfriend00

+0

क्या jfriend00 कहता है – chickenchilli

उत्तर

12

यह एक कामकाजी उदाहरण है जिसका मैं उपयोग कर रहा हूं। लेकिन किसी भी तरह (शायद केवल मेरे मामले में) यह बहुत धीमा हो सकता है।

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