2012-05-17 5 views
9

Sto imparando Flask e sto tentando di elaborare il modello dei file di caricamento documentato qui: http://flask.pocoo.org/docs/patterns/fileuploads/. Sto lavorando su Firefox 12 su Windows 7 e sto facendo funzionare la mia app in modalità di debug sul mio computer locale.Flask: IOError durante il salvataggio dei file caricati

Sto copiando l'esempio letteralmente, ad eccezione del valore della variabile UPLOAD_FOLDER, che ho definito come UPLOAD_FOLDER = '/uploads' e ho creato una directory chiamata "uploads" che è presente nella root dell'applicazione (insieme alle directory statiche e template).

Al momento di caricare il file, sto ricevendo l'errore: IOError: [Errno 2] No such file or directory: '/uploads\\u.png'

È interessante notare che, se a specificare una stringa prima per la cartella uploads che punta direttamente ai file caricati direttamente sulla mia macchina come UPLOAD_FOLDER = r'C:\Python27\projects\Flask\myproject\uploads', tutto funziona bene.

Non sto specificando la directory nel modo giusto? La directory dei caricamenti dovrebbe essere collocata altrove?

+1

Aggiornamento: Questa permutazione sembra funzionare: 'UPLOAD_FOLDER = './Uploads /''. Mi piacerebbe ancora capire perché, e se lo stesso modello dovrebbe essere utilizzato durante la distribuzione sul server web. – slachterman

risposta

12

La barra all'inizio di "/ upload" rende assoluta la specifica del percorso: la barra iniziale rappresenta la radice della gerarchia del filesystem. Anche se questo potrebbe non essere esattamente il modo in cui le cose funzionano su Windows, ha senso che Python lo comprenda in questo modo poiché le sue funzioni di gestione dei percorsi sono multipiattaforma.

I moduli "uploads" e "./uploads/" sono equivalenti e sono relativi.

Si noti che i percorsi relativi sono relativi alla directory corrente, che non si controlla necessariamente, pertanto è possibile specificare un percorso assoluto per UPLOAD_FOLDER.

+2

Su Windows, '/ uploads' (o' \ uploads') fa riferimento alla directory principale dell'unità corrente. Se la directory corrente è 'D: \ Projects \ FlaskTest', allora si riferisce a' D: \ uploads'. – Helgi

32

Perché non provarlo, funziona per me.

APP_ROOT = os.path.dirname(os.path.abspath(__file__)) 
UPLOAD_FOLDER = os.path.join(APP_ROOT, 'static/uploads') 
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER 
+0

Mi piace questa soluzione. Molto elegante e meno fragile di altre forme. – whoisjuan

+0

questo è un bene. – tyan

+0

os.path.join (APP_ROOT, 'static/uploads') funziona solo se il file python si trova nella cartella principale. Non dimenticare di cambiare il percorso in base al percorso di esecuzione del file –