2016-07-01 5 views
1

Ich habe ein Verzeichnis ./Logs, wo ich Dateien vom Server protokolliere und auch dem Client alle Dateinamen anzeigen, Jetzt hat jede Datei Download-Option vom Client, so wenn Benutzer Aufruf Download-Methode Ich sende Dateiname an den Server-Route als Param und suchen Sie nach Datei im angegebenen Pfad mit forEach on./Logs Verzeichnis Ich bin in der Lage, Dateiname, der vom Client kommt und in der Lage zu drucken als data so bis hier funktioniert, jetzt sehe ich den Fehler Pfad muss absolut sein, Any Idee Wie kann ich eine angepasste Datei zum Download an den Client senden?Wie sendFile aus dem Verzeichnis, wenn Routenparameter mit dem Dateinamen übereinstimmen?

angularFactory.js

getFile:function(file_name){ 
       return $http.get("/file?file_name="+file_name); 
      } 

app.js

app.get('/file', function (req, res) { 
    var dir = './ditLogs'; 
    var root = path.resolve('./ditLogs'); 
    var fileName = req.query.file_name; 
    var data; 
    fs.readdir(dir, function(err, items) { 
     items.forEach(function(file){ 
      if(fileName === file){ 
       data = file; 
       console.log('DATA',data); 
       res.setHeader('Content-Disposition', 'attachment; filename=' + data); 
       res.sendFile(data, {root: root}); 
       // res.sendFile(path.resolve(dir + '/' + data)); 
       // res.sendFile(data, {root: root}); 
       console.log(data); 
      } 
     }); 
    }); 
}); 

Fehler

throw new TypeError('path must be absolute or specify root to res.sendFile'); 
^ 
+0

Wenn Sie Express verwenden, sollten Sie das wahrscheinlich als Tag hinzufügen. – Paul

Antwort

1

./Logs/somefile.txt Sie müssen path.resolve verwenden, um den absoluten Pfad der Datei zu erhalten oder eine Startbahn mit der root Option

if(fileName === file){ 
    data = file; 
    console.log('DATA',data) 
    res.sendFile(path.resolve(path + '/' + data)); 
}  
angeben

oder

var root = path.resolve('./Logs'); 
/* ....... */ 
if(fileName === file){ 
    data = file; 
    console.log('DATA',data)   
    res.sendFile(data, {root: root}); 
} 

Ihr Weg s sind nicht absolut (ej: ./Logs/log1.txt ist nicht das gleiche wie /my/path/to/Logs/log1.txt) daher der Fehler.

Um den Browser mit einem Dialogfeld zur Eingabe des Benutzers zu veranlassen, verwenden Sie res.setHeader und einen Content-Disposition Header.

var root = path.resolve('./Logs'); 
/* ....... */ 
if(fileName === file){ 
    data = file; 
    res.setHeader('Content-Disposition', 'attachment; filename=' + data);  
    res.sendFile(data, {root: root}); 
} 
+0

Dies ist das Senden von Daten aus der Datei, ich möchte ganze Datei senden, damit Benutzer es vom Client herunterladen können, ist es möglich? – hussain

+0

@hussain In meinem Code 'data' ist eine Zeichenkette mit dem Dateinamen, so wie Sie es in Ihren Code geschrieben haben. Der erste Parameter in 'res.sendFile (path)' ist ein Dateipfad mit einem Dateinamen wie '/ my/path/to/Logs/log1.txt', nicht der Inhalt der Datei. Probieren Sie den Code aus. – devconcept

+0

ja, ich habe versucht, dass als Antwort ich Inhalt der Datei nicht die Datei selbst erhalten – hussain

1

Warum nicht einfach die statische Middleware verwenden?

app.use('/file', express.static('Logs')); 

URLs dann http://yoursite.com/file/somefile.txt Karte würde

+0

Hussain erwähnte nicht, dass er Express benutzt. – Everettss

+0

Er tat es nicht, aber die Verwendung von app.get() und der Rest seines Codes deuten darauf hin. – Paul

+0

@Paul Ich benutze Express Ich habe Code hinzugefügt, wie Sie mit app.use erwähnt, aber seine 404 auf Client-Seite werfen. – hussain

Verwandte Themen