2013-02-24 13 views
11

HTML:Come caricare e salvare un file utilizzando framework bottiglia

<form action="/upload" method="post" enctype="multipart/form-data"> 
    Category:  <input type="text" name="category" /> 
    Select a file: <input type="file" name="upload" /> 
    <input type="submit" value="Start upload" /> 
</form> 

Vista:

@route('/upload', method='POST') 
def do_login(): 
    category = request.forms.get('category') 
    upload  = request.files.get('upload') 
    name, ext = os.path.splitext(upload.filename) 
    if ext not in ('png','jpg','jpeg'): 
     return 'File extension not allowed.' 

    save_path = get_save_path_for_category(category) 
    upload.save(save_path) # appends upload.filename automatically 
    return 'OK' 

che sto cercando di fare questo codice, ma non funziona. Cosa sto facendo di sbagliato?

+4

'get_save_path_for_category' è solo un esempio utilizzato nella documentazione Bottle e non fa parte dell'API Bottle. Prova a impostare 'save_path' su'/tmp' o qualcosa del genere. Se questo non aiuta: inserisci errori ... – robertklep

+2

E: Il metodo upload.save() è parte di bottle-0.12dev che non è ancora stato rilasciato. Se si utilizza il flacone 0.11 (l'ultima versione stabile), fare riferimento alla documentazione stabile. – defnull

+0

si ottiene questo errore "raise AttributeError, name AttributeError: save"? .. – Hamoudaq

risposta

23

A partire da bottiglia 0,12 classe FileUpload è stato attuato con la sua upload.save() funzionalità.

Ecco esempio per la Bottle-0,12:

import os 
from bottle import route, request, static_file, run 

@route('/') 
def root(): 
    return static_file('test.html', root='.') 

@route('/upload', method='POST') 
def do_upload(): 
    category = request.forms.get('category') 
    upload = request.files.get('upload') 
    name, ext = os.path.splitext(upload.filename) 
    if ext not in ('.png', '.jpg', '.jpeg'): 
     return "File extension not allowed." 

    save_path = "/tmp/{category}".format(category=category) 
    if not os.path.exists(save_path): 
     os.makedirs(save_path) 

    file_path = "{path}/{file}".format(path=save_path, file=upload.filename) 
    upload.save(file_path) 
    return "File successfully saved to '{0}'.".format(save_path) 

if __name__ == '__main__': 
    run(host='localhost', port=8080) 

Nota: os.path.splitext() funzione fornisce l'estensione in" <ext>. "Formato, non" <ext> ".

  • Se si utilizza la versione precedente Bottle-0,12, cambiamento:

    ... 
    upload.save(file_path) 
    ... 
    

a: server di

... 
    with open(file_path, 'w') as open_file: 
     open_file.write(upload.file.read()) 
    ... 
  • Run;
  • Digitare "localhost: 8080" nel browser.
+0

'con open (file_path, 'wb') come open_file', altrimenti ottieni l'errore' TypeError: deve essere str, not bytes' –

Problemi correlati