I'm using the 'upload' field type with SQLFORMs to upload files to the
server. However, for certain files with longer names, I get this
exception:
<type 'exceptions.IOError'>([Errno 2] No such file or directory: 'C:\
\Users\\---------------\\Documents\\------\\---------------\
\--------------------------\\web2py\\applications\\webcollection\
\databases\\..\\uploads\\usermodel_file_store.file.9dbf56ec79482a5b.
68616c6f6c7a2d646f742d636f6d2d6e36342d736e65732d796f756d696768746265747279696e67746f686172642e6a7067.jpg')
(Dashes are hiding my personal folder names, they don't actually
appear like that)
I couldn't for the life of me figure out what was going on, until I
luckily tried uploading a file with a short name, which worked
perfectly.
Doing some digging, it looks like Windows has a maximum length of 260
characters for a file's combined path and name (http://
windows.microsoft.com/en-US/windows-vista/File-names-and-file-name-
extensions-frequently-asked-questions). Doing some experimenting in
windows explorer, this appears accurate.
So, between my long base path and the long encoded file names, I'm
hitting that limit.
All that out of the way, I guess I have two questions:
1) Is there an easy way to "overload" the default behavior of the
SQLFORM so it stores the filename in the database, instead of encoding
it in the renamed-file? I see the Field class has a custom_store/
retrieve variable, could I just duplicate the default DAL store/
retrieve functions and add my extra file name logic? Or is there a
better way?
2) Is there any way for web2py to better identify this exception? I
could imagine some people scratching their heads for a quite a while
on it.
One thing you can do it is
Field('name','upload',length=260)
it will truncate the generated filename to 260. That means it will not
be able to reconstruct the full original name but only part of it.
Anyway, give it a try and let us know.
> 2) Is there any way for web2py to better identify this exception? I
> could imagine some people scratching their heads for a quite a while
> on it.
Python raises an IOError. This could have many possible causes. I
changed the code in trunk to re-raise the exception with more info.
Check if this is acceptable.
Massimo
> 1) Is there an easy way to "overload" the default behavior of the
> SQLFORM so it stores the filename in the database, instead of encoding
> it in the renamed-file? I see the Field class has a custom_store/
> retrieve variable, could I just duplicate the default DAL store/
> retrieve functions and add my extra file name logic? Or is there a
> better way?One thing you can do it is
Field('name','upload',length=260)
it will truncate the generated filename to 260.