2017-09-03 2 views
0

Ich verwende eine JQuery AJAX-Anfrage, die einen Download nach dessen Abschluss auslöst.Jquery Initiated Download Rückgabe 'Fehlgeschlagen: Netzwerkfehler'

Code:

$('.getPDF').click(function(){ 
var filepath = 'localhost:3000/pdf/formula-' + this.id + '.pdf'; 
$.ajax({ 
    url: '/formulas/'+ this.id +'/pdf', 
    type: 'POST', 
    success: downloadFile(filepath) 
}); 

function downloadFile (path) { 
    var link = document.createElement('a'); 
    link.href = path; 
    $(link).attr("download", true); 
    link.click(); 
    } 
}); 

Dies gibt den folgenden Fehler in Chrome:

Failed - Network Error 

mit nichts anderem in der Konsole zeigt nach oben. Der Download funktioniert auch nicht in Firefox oder IE.

Ich habe eine console.log(filepath) in Erfolg, und die Route, die es zurückgibt, zeigt die richtige Datei, wenn ich es in die Browser-Leiste als URL einfügen.

Die HTML die AJAX-Request erzeugen, sieht wie folgt aus:

<a class="pure-button button-success getPDF" id="59ac514a52c93e4aa862fadd">Generate PDF </a> 

Wenn es relevant ist, die allgemein der Server-Side-Code wie folgt aussieht:

router.post('/formulas/:id/pdf', function(req, res){ 
    var db = req.db.collection('users'); 
    var id = new ObjectID(req.params.id); 
    var pointer = {"formulas.$": 1, "_id": 0}; 
    db.aggregate([ 
    {$match: {"formulas.f_id": id}}, 
    {$unwind: "$formulas"}, 
    {$match: {"formulas.f_id": id}}, 
    {$project : {"formulas": 1, "_id": 0}} 
    ]).toArray(function(e, doc){ 
    if (e) { 
    throw e; 
    } else { 
    var html = null; 
    ejs.renderFile('./views/pdf.ejs', { 
    project: doc[0].formulas 
    }, function(err, results){ 
    if (err) { 
     console.log(err); 
     } 
     html = results; 
    }); 
    var options = { format: 'Letter' }; 
    var path = 'public/pdf/formula-' + req.params.id + '.pdf'; 
    pdf.create(html, options).toFile(path, function(err, results) { 
     if (err) { 
     return console.log(err); 
     } 
     if (results) { 
     res.end(); 
     } 
    }); 
    } 
    }); 
}); 
+0

Das 'downloadFile' wird nicht beim Erfolg aufgerufen, aber sofort, da Sie die Klammern eingefügt haben. Das sollte aber nicht wirklich wichtig sein? Haben Sie eine statische Route, die das PDF-Dokument, das Sie herunterladen möchten, tatsächlich bereitstellt? – adeneo

+0

@adeneo - Ja, ich habe die statische Route getestet und die Datei wird korrekt bereitgestellt. –

+0

Haben Sie versucht, das Protokoll hinzuzufügen? Da 'Dateipfad' in einem Anker href verwendet wird ... Vielleicht ...' var Dateipfad = 'http: // localhost: 3000/pdf/Formel-' + this.id + '.pdf'; ' –

Antwort

1

Der Ajax Erfolg Callback hat eine Funktion sein ...
Das erste Argument kann wie gewünscht benannt werden ... Aber wird mit der Ajax Antwort gefüllt werden.

So ist die Antwort Ihre filepath Variable überschreiben ...
Um dies zu vermeiden, rufen Sie downloadFile innerhalb einer Callback-Funktion.
Und ignorieren Sie einfach die Antwort, wenn Sie es nicht brauchen. ;)

success: function(response){ 
    downloadFile(filepath); 
} 
Verwandte Themen