Hi!
I want to allow users to store files in my web application by both these
methods:
- By uploading the file from their hard drives
- By providing a URL where the file is located. Then, there's no upload
and the controller downloads the file and inserts it in the database.
I know how to accomplish that with a FORM and a db.table.insert, however *I
would like to use Crud if it's possible*. Here is a simplified version
(without any error checking) of what I've tried:
# In models/db_documents.py
db.define_table('documents',
Field('name'),
Field('description'),
Field('url'),
Field('file_', 'upload'))
# In controllers/documents.py
import urllib2
from gluon.tools import Crud
def upload_document():
"""
Let users store files either by:
- uploading the file, or
- providing a URL where the file is located
"""
def download_document(form):
"""Download the file if the user provided a URL, and store it in
form.vars.file_
"""
if form.vars.url != '':
form.vars.file_ = urllib2.urlopen(form.vars.url) # Doesn't work
crud = Crud(db)
crud.settings.create_onvalidation.documents.append(download_document)
form = crud.create(db.documents, next='document_uploaded')
return {'form': form}
It works well in the first case, 'upload a file', but I don't know how to
address the second case, 'provide a URL'. Specifically I don't know how to
insert the file in the database after having downloaded it with urllib2. In
the code you can see that I tried with:
form.vars.file_ = urllib2.urlopen(form.vars.url)
and it doesn't work. When the file is uploaded by the user (instead of
providing a URL) I've seen that form.vars.file_ is an instance of
FieldStorage. Probably that's why assigning a file-like object (the one
returned by urllib2.urlopen) directly to form.vars.file_ doesn't work. Also
I haven't found FieldStorage in the web2py documentation so probably it's
an internal class and cannot create an instance myself. That makes me think
maybe I cannot solve my problem with Crud.
Surprisingly, assigning a string to form.vars.file_ works in some way. I
mean, doing:
form.vars.file_ = urllib2.urlopen(form.vars.url).read() # Assign a string
instead of:
form.vars.file_ = urllib2.urlopen(form.vars.url) # Assign a file-like object
web2py creates a text file named 'file.txt' and stores the content of the
string in it. If there is a way to change the default 'file.txt' name I
think I will be fine too. I want to preserve the original name and
extension.
Cheers,
Manu
--
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
---
You received this message because you are subscribed to the Google Groups
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.