11

I am learning Flask and am attempting to work through the uploading files pattern documented here: http://flask.pocoo.org/docs/patterns/fileuploads/. I am working in Firefox 12 on Windows 7, and am running my app in debug mode on my local machine.

I am copying the example verbatim, except for the value of the UPLOAD_FOLDER variable, which I have defined as UPLOAD_FOLDER = '/uploads' and have created a directory called "uploads" which is present in the application root (along with the static and template directories).

Upon uploading the file, I am receiving the error: IOError: [Errno 2] No such file or directory: '/uploads\\u.png'

Interestingly, if I specify a raw string for the uploads folder which points directly to the uploads directly on my machine like UPLOAD_FOLDER = r'C:\Python27\projects\Flask\myproject\uploads', everything works just fine.

Am I not specifying the directory in the right way? Should the uploads directory be placed somewhere else?

pigletfly
  • 1,051
  • 1
  • 16
  • 32
slachterman
  • 1,515
  • 4
  • 17
  • 23
  • 1
    Update: This permutation appears to work: `UPLOAD_FOLDER = './uploads/'`. I'd still like to understand why, and if the same pattern should be used when deploying to the web server. – slachterman May 17 '12 at 14:12

2 Answers2

33

Why not try this, it works for 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
plaes
  • 31,788
  • 11
  • 91
  • 89
ajknzhol
  • 6,322
  • 13
  • 45
  • 72
  • I like this solution. Very elegant and less fragile than other forms. – whoisjuan Dec 03 '14 at 06:50
  • os.path.join(APP_ROOT, 'static/uploads') works only if your python file is in the root folder. Don't forget to change the path according to the file execution path – Mr Bonjour Oct 31 '17 at 09:29
12

The slash at the beginning of '/uploads' makes the path specification absolute: the leading slash represents the root of the filesystem hierarchy. While that might not be exactly how things work on Windows, it makes sense for Python to understand it this way as its path-handling functions are cross-platform.

The forms 'uploads/' and './uploads/' are equivalent and they are relative.

Note that relative paths are relative to the current directory, which you don't necessarily control, so you might want to specify an absolute path for UPLOAD_FOLDER.

jd.
  • 10,678
  • 3
  • 46
  • 55
  • 2
    On Windows, `/uploads` (or `\uploads`) refers to the root of the current drive. If the current directory is `D:\Projects\FlaskTest`, then it's referring to `D:\uploads`. – Helgi May 18 '12 at 04:59