2016-06-21 7 views
1

Ich versuche, eine PDF-Datei mit jquery, ajax & django herunterladen.jquery ajax nicht dienen pdf-Datei

Mein django views.py:

if request.POST.get('action') == 'download_labels': 
    order_list = json.loads(request.POST.get('order_dict'), None) 
    PackedOrders(dbname, order_list).downloadLabels() 
    file = open('shipping_labels.pdf','rb') 
    response = HttpResponse(file, content_type='application/pdf') 
    response['Content-Disposition'] = "attachment; filename=shipping_labels.pdf" 
    os.system('rm shipping_labels.pdf') 
    return HttpResponse(response, content_type='application/pdf') 

Meine Ajax-Abfrage:

data : {action:'download_labels', 
     order_dict:JSON.stringify($checkedRows)}, 

success : function(response, status, request) { 
    var file = new Blob([response], {type: 'application/pdf'}); 
    var fileURL = window.URL.createObjectURL(file); 
    window.open(fileURL,'_blank'); 
}, 

Die Ajax gibt die Datei als binäre Daten Ansprech- und öffnen Sie sie in einem neuen Tab. Aber alles, was ich in der neuen Registerkarte sehe, sind leere Seiten. Die Anzahl leerer Seiten entspricht der Anzahl der Seiten in der Original-PDF-Datei.

In Konsole sehe ich:

Error: Invalid XRef stream header 
... 
Warning: Indexing all PDF objects 
pdf.worker.js (line 235) 
<System> 
PDF 85b859244e496561d60d217869d5d38a [1.3 -/-] (PDF.js: 1.3.76) 
Error: Bad FCHECK in flate stream: 120, 239 
... 

Here die komplette Protokolldatei ist.

Antwort

0

Ich bin kein Experte für jQuery, aber ich glaube nicht, dass jQuery Ajax Blobs unterstützt. In der Dokumentation werden nur diese Datentypen aufgelistet: xml, json, script oder html. Allerdings war ich in der Lage, diese Funktionalität zu erhalten, ohne mit jQuery zu arbeiten und mit einfachen JavaScript mit diesem Code mit Ajax,

Mein JavaScript (ich würde auch Fehler in dem Umgang mit diesem)

var xhr = new XMLHttpRequest(); 
xhr.open('GET', '/pdf_test', true); 
xhr.responseType = 'blob'; 

xhr.onload = function(e) { 
    if (this.status == 200) { 
    var blob = new Blob([this.response], {type: 'application/pdf'}), 
    fileURL = URL.createObjectURL(blob); 
    window.open(fileURL,'_blank'); 
    } 
}; 

xhr.send(); 

Mein django Blick (ich möchte hinzufügen, auch Fehler zu dieser Behandlung)

def pdf_test(request): 
    pdf_file = open(r'C:\Pdfs\calculation_of_semiconductor_failure_rates.pdf', 'rb') 
    response = HttpResponse(pdf_file, content_type='application/pdf') 
    response['Content-Disposition'] = 'attachment; filename="shippinglabels.pdf"' 
    return response 

auf dieses, wenn Sie in einem neuen Tab öffnen müssen nicht herunterladen, sondern kann einfach die Datei, dann können Sie ajax/Javascript komplett vermeiden und nur verwenden HTML, das ist ein einfacher Ansatz

<a id="pdf-test" href="/pdf_test">Download PDF</a>

Für Kredit und weiterführende Literatur benutzte ich diese Links

jQuery Ajax

StackOverflow question

Introduction to JavaScript Blobs and File Interface