2012-05-17 7 views
9

Estoy aprendiendo Flask y estoy intentando trabajar con el patrón de carga de archivos documentado aquí: http://flask.pocoo.org/docs/patterns/fileuploads/. Estoy trabajando en Firefox 12 en Windows 7 y estoy ejecutando mi aplicación en modo de depuración en mi máquina local.Frasco: IOError al guardar archivos cargados

Estoy copiando el ejemplo textualmente, excepto por el valor de la variable UPLOAD_FOLDER, que he definido como UPLOAD_FOLDER = '/uploads' y he creado un directorio llamado "uploads" que está presente en la raíz de la aplicación (junto con los directorios estáticos y de plantillas)

Al subir el archivo, estoy recibiendo el error: IOError: [Errno 2] No such file or directory: '/uploads\\u.png'

Curiosamente, si puedo especificar una cadena de texto en la carpeta de archivos que apunta directamente a los archivos directamente en mi máquina como UPLOAD_FOLDER = r'C:\Python27\projects\Flask\myproject\uploads', todo funciona muy bien.

¿No estoy especificando el directorio de la manera correcta? ¿Debería colocarse el directorio de carga en otro lugar?

+1

Actualización: Esta permutación parece funcionar: 'UPLOAD_FOLDER = './Uploads /' '. Todavía me gustaría entender por qué, y si el mismo patrón se debe utilizar al implementar en el servidor web. – slachterman

Respuesta

12

La barra al principio de '/ uploads' hace que la especificación de ruta sea absoluta: la barra diagonal representa la raíz de la jerarquía del sistema de archivos. Si bien eso podría no ser exactamente cómo funcionan las cosas en Windows, tiene sentido que Python lo entienda de esta manera ya que sus funciones de manejo de rutas son multiplataforma.

Los formularios 'uploads /' y './uploads/' son equivalentes y son relativos.

Tenga en cuenta que las rutas relativas son relativas al directorio actual, que no controla necesariamente, por lo que es posible que desee especificar una ruta absoluta para UPLOAD_FOLDER.

+2

En Windows, '/ uploads' (o' \ uploads') se refiere a la raíz de la unidad actual. Si el directorio actual es 'D: \ Projects \ FlaskTest', entonces se refiere a' D: \ uploads'. – Helgi

32

Por qué no probar esto, funciona para mí.

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

Me gusta esta solución. Muy elegante y menos frágil que otras formas. – whoisjuan

+0

esto es bueno. – tyan

+0

os.path.join (APP_ROOT, 'static/uploads') funciona solo si su archivo python está en la carpeta raíz. No olvide cambiar la ruta de acuerdo con la ruta de ejecución del archivo –

Cuestiones relacionadas