2015-03-15 27 views
5

Dosyaları bir istemciden sunucuya yüklemeyi başardım ancak şimdi tam tersi bir şekilde ulaşmak istiyorum. Ne yazık ki, bu modül için resmi modül sayfasındaki belgeler eksiktir. Sunucudan istemciye socket.io-stream ile dosya aktarımı

  • sunucu yayılan akışına bir readstream ve boru oluşturun gerekir
  • sunucuya dosya adıyla bir dere ve 'download'-olay yayarlar:

    Aşağıdaki yapmak istiyorum istemci akışı ulaştığında, bir indirme-pop-up görünür ve nerede dosyayı

i istiyorum basit dosya-köprüleri kullanmayın nedeni kurtarmak için sormalısınız istemci

  • obfuscati olduğunu ng: sunucudaki dosyalar gizlendi ve yeniden adlandırıldı, bu yüzden her bir indirme isteği için bunları şifrelemek ve yeniden adlandırmak zorundayım.

    Bu işe başladığım için herhangi bir kod parçacığı var mı?

  • +0

    http bunun için protokol desteği yüklenmeden WebSocket'e aracılığıyla sunucudan istemciye akışı dosyaları olduğunda neden hep merak ettik. Bir URL'yi müşteriye vererek bir indirme işlemini tetiklemek için webSocket'i kullanabilir, ancak müşterinin webSockets üzerinden değil de bu URL'nin normal bir http akışını talep etmesini sağlayabilirsiniz. Bu şekilde, webSocket'i bir bildirim sistemi olarak ücretsiz tutar ve büyük yüklemeler için http üzerinden daha geleneksel akış protokolleri kullanırsınız. – jfriend00

    +0

    Ne j arkadaş00 diyor ki – chickenchilli

    cevap

    12

    Kullanmakta olduğum bir çalışma örneğidir. Ama bir şekilde (belki de sadece benim durumumda) bu çok yavaş olabilir.

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