2017-04-13 5 views
0

Hier ist der Link, den ich verwendet habe (Download files from Amazon S3 with Django). Mit diesem kann ich einzelne Dateien herunterladen.Laden Sie mehrere Dateien von S3 django

Code:

s3_template_path = queryset.values('file') 
filename = 'test.pdf' 
conn = boto.connect_s3('<aws access key>', '<aws secret key>') 
bucket = conn.get_bucket('your_bucket') 
s3_file_path = bucket.get_key(s3_template_path) 
response_headers = { 
'response-content-type': 'application/force-download', 
'response-content-disposition':'attachment;filename="%s"'% filename 
} 
url = s3_file_path.generate_url(60, 'GET', 
      response_headers=response_headers, 
      force_http=True) 
return HttpResponseRedirect(url) 

ich mehrere Dateien von S3 herunterladen müssen, wie ein Reißverschluss besser wäre. Kann die genannte Methode geändert und verwendet werden? Wenn nicht, schlagen Sie bitte eine andere Methode vor.

+0

ist s3_template_path das gleiche für jede Datei, die Sie suchen? – kujosHeist

+0

nein, Vorlagenpfad ist anders – Manasa

Antwort

1

Okay, hier ist eine mögliche Lösung, es lädt im Grunde jede Datei herunter und zippt sie in einen Ordner und gibt diese dann an den Benutzer zurück.

Nicht sicher, ob s3_template_path ist das gleiche für jede Datei, aber dies ändern, wenn nötig

# python 3 

import requests 
import os 
import zipfile 

file_names = ['test.pdf', 'test2.pdf', 'test3.pdf'] 

# set up zip folder 
zip_subdir = "download_folder" 
zip_filename = zip_subdir + ".zip" 
byte_stream = io.BytesIO() 
zf = zipfile.ZipFile(byte_stream, "w") 


for filename in file_names: 
    s3_template_path = queryset.values('file') 
    conn = boto.connect_s3('<aws access key>', '<aws secret key>') 
    bucket = conn.get_bucket('your_bucket') 
    s3_file_path = bucket.get_key(s3_template_path) 
    response_headers = { 
    'response-content-type': 'application/force-download', 
    'response-content-disposition':'attachment;filename="%s"'% filename 
    } 
    url = s3_file_path.generate_url(60, 'GET', 
       response_headers=response_headers, 
       force_http=True) 

    # download the file 
    file_response = requests.get(url) 

    if file_response.status_code == 200: 

     # create a copy of the file 
     f1 = open(filename , 'wb') 
     f1.write(file_response.content) 
     f1.close() 

     # write the file to the zip folder 
     fdir, fname = os.path.split(filename) 
     zip_path = os.path.join(zip_subdir, fname) 
     zf.write(filename, zip_path)  

    # close the zip folder and return 
    zf.close() 
    response = HttpResponse(byte_stream.getvalue(), content_type="application/x-zip-compressed") 
    response['Content-Disposition'] = 'attachment; filename=%s' % zip_filename 
    return response   
+0

Sorry, ich habe es zweimal bearbeitet, diese Version sollte funktionieren, solange die Datei_Antwort = requests.get (URL) die Datei korrekt zurückgibt – kujosHeist

+0

Danke, werde dies ausprobieren – Manasa

+0

Okay, Sie müssen möglicherweise s3_template_path generieren Inside Loop, lass es mich wissen, wenn es funktioniert – kujosHeist