2013-02-24 10 views
11

HTML:Jak załadować i zapisać plik przy użyciu butelka ramowa

<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> 

Widok:

@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' 

Próbuję zrobić ten kod, ale to nie działa. Co robię źle?

+4

'get_save_path_for_category' jest tylko przykładem użytym w dokumentacji Bottle, a nie częścią Bottle API. Spróbuj ustawić 'save_path' na'/tmp' lub coś podobnego. Jeśli to nie pomoże: po błędzie ... – robertklep

+2

Oraz: Metoda upload.save() jest częścią butelki-0.12dev, która nie została jeszcze wydana. Jeśli używasz butelki 0.11 (najnowsza stabilna wersja), odnieś się do stabilnej dokumentacji. – defnull

+0

pojawia się ten błąd "podniesienie AttributeError, nazwa AttributeError: save"? .. – Hamoudaq

Odpowiedz

23

Od butelki 0,12 potrzeb klasy FileUpload zrealizowano z upload.save() funkcjonalności.

Oto przykład dla 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) 

Uwaga: os.path.splitext() funkcja daje rozszerzenie w”<ext>. "Format, a nie" <ext> ".

  • przypadku korzystania z wersji poprzedniej do butelki 0,12, zmiany:

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

do: serwer

... 
    with open(file_path, 'w') as open_file: 
     open_file.write(upload.file.read()) 
    ... 
  • Run;
  • Wpisz "localhost: 8080" w przeglądarce.
+0

'with open (ścieżka_pliku, 'wb') jako open_file', w przeciwnym razie otrzymasz' TypeError: musi być str, a nie bajtów' error –

Powiązane problemy