2015-12-01 17 views
9

Mam aplikację węzła z wysyłaniem i wysyłaniem żądania od klienta, takiego jak listonosz i muszę pobrać plik z req i wyodrębnić go do lokalnego folderu, w jaki sposób mogę to zrobić?Wyodrębnij plik zip do lokalnego folderu

znalazłem następujące open source, ale nie wiesz, jak zabrać ciało req i rozpakować go w moim folderze lokalnym jak „C: // test // extractDest”

Poniższy kod jest brane z następującym open source, ale jeśli nie jest inny dobry open source za to można go używać zamiast https://www.npmjs.com/package/decompress-zip

var DecompressZip = require('decompress-zip'); 
var unzipper = new DecompressZip(filename) 

unzipper.on('error', function (err) { 
    console.log('Caught an error'); 
}); 

unzipper.on('extract', function (log) { 
    console.log('Finished extracting'); 
}); 

unzipper.on('progress', function (fileIndex, fileCount) { 
    console.log('Extracted file ' + (fileIndex + 1) + ' of ' + fileCount); 
}); 

unzipper.extract({ 
    path: "C://Test//extractDest", 
    filter: function (file) { 
     return file.type !== "SymbolicLink"; 
    } 
}); 

ten sposób mogę wysłać plik zip po prostu wybrać binarny i wybierz plik zip

enter image description here

+0

To może Cię http pomóc: // stuk. github.io/jszip/documentation/howto/read_zip.html – vinayr

+0

@vinayr - Dzięki, ale jak mam go używać z ekspresowym? –

+0

Czy byłbyś zainteresowany wykorzystaniem rozpakowanego pliku WWW? coś takiego jak api konwersji w chmurze będzie miało więcej możliwości, niż wiele modułów rozpakowujących javascript. – Binvention

Odpowiedz

9

polecam używasz multer która współpracuje z multipart/form-data content-type.

Oto podstawowy przykład działania. Zakłada on, że przesyłamy tylko jeden plik, folder o nazwie "uploads" istnieje w katalogu głównym projektu i pole formularza o nazwie "singleFileUpload" do przechowywania danych. Można zmienić wszystkie te po multer documentation:

var path  = require("path"); 
var express = require("express"); 
var multer = require("multer"); 
var Unzipper = require("decompress-zip"); 


var app = express(); 

app.use(multer({dest:'./uploads/'}).single('singleFileUpload')); 


app.post("/", function(req, res){ 

    if (req.file){ 

     var filepath = path.join(req.file.destination, req.file.filename); 
     var unzipper = new Unzipper(filepath); 

     unzipper.on("extract", function() { 
      console.log("Finished extracting"); 
     }); 

     unzipper.extract({ path: "C://Test//extractDest"}); 
    } 

    res.status(204).end(); 
}); 


app.listen(3000); 

Korzystanie listonosza można teraz przesyłać i dekompresji plików w tej konfiguracji:

enter image description here

+0

Dzięki 1+ tylko jedno wyjaśnienie, dlaczego potrzebujemy ścieżki var file = path.join (req.file.destination, req. file.filename) ;? –

+0

Pewnie. req.file.destination to ścieżka do folderu przesłanego pliku (./uploads/ w twoim przypadku), a req.file.filename to nazwa pliku (multer generuje nazwę dla ciebie). Musisz połączyć oba dla dekompresji, aby wiedzieć, gdzie znajduje się plik do rozpakowania. – cviejo

6

Można użyć multer i uzip2 to zrobić.

Dla niektórych informacji, Moja struktura App jak ten poniżej:

//App path --> C:\xampp\htdocs\service 

service\ 
    | 
    -- tmp\ 
    | 
    -- app.js 
    | 
    -- index.html 

Oto mój kod:

var express = require("express"); 
var fs = require("fs"); 
var unzip = require("unzip2"); //module for extracting files 
var app = express(); 

var multer = require("multer"); 
var multer_dest = multer({dest: "./tmp"}).single('zipFile'); 

app.post("/upload_zip",multer_dest,function(req,res){ 
    console.log(req.file);  
    fs.createReadStream(req.file.path).pipe(unzip.Extract({path: 'C:\\Test\\extractDest'})); 
    result = { 
     file:req.file, 
     message:"File has been extracted" 
    }; 
    fs.unlink(req.file.path, function (e) { 
     if (e) throw e; 
     console.log('successfully deleted '+req.file.path); 
    }); 
    res.end(JSON.stringify(result)); 
}); 

var server = app.listen(8081,function(){ 
    var host = server.address().address; 
    var port = server.address().port; 
    console.log("Example App Listening at http://%s:%s",host,port); 
}) 

wyjściowa: enter image description here

Powiązane problemy