2015-12-01 25 views
9

Ho l'app nodo con richiesta di invio express e im dal client come postino e ho bisogno di ottenere il file dal req ed estrarlo nella mia cartella locale, come posso farlo?Estrarre il file zip nella cartella locale

ho trovato la seguente open source, ma non è sicuro come prendere il corpo req ed estrarlo nella mia cartella locale come "C: // // test extractDest",

Il codice qui sotto è preso dalla seguente open source, ma se non v'è altra buona open source per questo posso usare al posto 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"; 
    } 
}); 

questo è come io mando il file zip ho semplicemente selezionare binario e scegliere il file zip

enter image description here

+0

Questo potrebbe aiutare a http: // stuk. github.io/jszip/documentation/howto/read_zip.html – vinayr

+0

@vinayr - Grazie, ma come dovrei usarlo con express? –

+0

ti piacerebbe usare un unipip basato sul web? qualcosa come il cloud convert api avrà più capacità di molti dei moduli di decompressione basati su javascript – Binvention

risposta

9

vi consiglio di utilizzare multer che funziona con multipart/form-data tipo di contenuto.

Ecco un esempio di funzionamento di base. Si presuppone che stiamo caricando solo un singolo file, esiste una cartella denominata "upload" nella radice del progetto e un campo modulo denominato "singleFileUpload" per contenere i dati. È possibile modificare tutti quelli che seguono il 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); 

Utilizzando postino ora è possibile caricare e decomprimere i file con questa configurazione:

enter image description here

+0

Grazie 1+ solo un chiarimento qual è la ragione per cui abbiamo bisogno del percorso var filepath = path.join (req.file.destination, req. file.filename) ;? –

+0

Sicuro. req.file.destination è il percorso della cartella del file caricato (./uploads/ nel tuo caso), e req.file.filename è il nome del file (multer genera il nome per te). È necessario combinare entrambi per decompress-zip per sapere dove si trova il file da decomprimere. – cviejo

6

È possibile utilizzare Multer e uzip2 per farlo.

Per alcune informazioni, La mia struttura App come questo qui sotto:

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

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

Ecco il mio codice:

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); 
}) 

uscita: enter image description here

Problemi correlati