[google-appengine] Re: Blobstore file upload with other form values
FWIW I'm facing the same problem and I'm reasonably certain the issue is simply a limitation of the BlobstoreUploadHandler. The handler stores uploaded blobs perfectly fine and gives your handler the BlobInfo for each blob BUT it seems to discard any non file (type='file') form fields. So if you want to upload a text description along with a photo you're out of luck (using the blobstore). I don't actually want the text description stored in the blobstore but I'd like it passed to the handler so I can store it in the datastore. PLEASE FIX this blobstore upload issue... please make other (non file) form fields available to BlobstoreUploadHandler derived classes. Thank you! On a separate note I'm really looking forward to the programmatic access to the blobstore that I see listed on the roadmap! -- You received this message because you are subscribed to the Google Groups "Google App Engine" group. To post to this group, send email to google-appengine@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
[google-appengine] Re: Blobstore file upload with other form values
I think you are right about BlobstoreUploadHandler limitations. When I tried something like: class X(db.Model): N = db.StringProperty() S = db.StringProperty() F = blobstore.BlobReferenceProperty() class Upload(blobstore_handlers.BlobstoreUploadHandler): def post(self): upload_files = self.get_uploads('file') a=upload_files[0] N = self.request.get('name') S = self.request.get('sname') if S: m=N + S else: m=S + N self.response.out.write(N) self.response.out.write(S) a=X(N=m, S=S, F=a) a.put() return self.redirect('/') It worked partly. I mean I put my model to datastore and file to blobstore. However, it does not writes the thing like: self.response.out.write(N). What I understand here we cannot use everything in BlobstoreUploadHandler. Also if you request the form fields, it does not work. -- You received this message because you are subscribed to the Google Groups "Google App Engine" group. To post to this group, send email to google-appengine@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
[google-appengine] Re: Blobstore file upload with other form values
Hi Robert, Thank you for your advices. I did not checked my logs before you said. When I checked my logs, it gives: w=upload_files[0] IndexError: list index out of range INFO 2011-02-13 07:17:39,486 dev_appserver_blobstore.py:328] Upload handler returned 500 ERROR2011-02-13 07:17:39,486 dev_appserver_blobstore.py:341] Invalid upload handler response. Only 301, 302 and 303 statuses are permitted and it may not have a content body. INFO 2011-02-13 07:17:39,509 dev_appserver.py:3317] "POST /_ah/ upload/agZlcGN2ZGJyHAsSFV9fQmxvYlVwbG9hZFNlc3Npb25fXxi_Agw HTTP/1.1" 500 - As I understand from it, It could not get the file so it gives list index out of range error. However, in another application I use the same structure and it does not give any error. Any suggestion about that? On Feb 13, 6:38 am, Robert Kluin wrote: > Some thoughts / suggestions: > 1) Check your url to handler mappings. Both in app.yaml and in your > WSGI app definition. > 2) Check the logs to see what urls are actually getting hit. > 3) At some point in the Upload handler you do create and put a new > Expert entity, right? > > Robert > > > > > > > > On Sat, Feb 12, 2011 at 06:41, theone wrote: > > Hello, > > > I want to keep user information and files with blobstore but I could > > not do it. > > I have a structure like: > > > class Expert(db.Model): > > N = db.StringProperty(indexed=True, required=True, > > verbose_name='Name') > > S = db.StringProperty(indexed=True, required=True, > > verbose_name='Surname') > > BD = db.DateProperty(indexed=True, required=True, verbose_name='Birth > > Date') > > EY = db.IntegerProperty(indexed=True, verbose_name='Years of > > Experience') > > > class AddExpert(webapp.RequestHandler): > > upload_url = blobstore.create_upload_url('/upload') > > doRender(self, "addexpert.htm", {'upload_url': upload_url } ) > > > and html form like: > > > > > > > Name > name="name" /> > > Surname > name="surname" /> > > > > > when I tried to upload my data and redirect my page: > > > class Upload(blobstore_handlers.BlobstoreUploadHandler): > > def post(self): > > upload_files = self.get_uploads('file') > > blob_info = upload_files[0] > > blob = blob_info.key() > > N = self.request.get('name') > > S = self.request.get('surname') > > .. > > self.redirect('/') > > > It redirects to an empty page. It saves the file at __BlobInfo__ (I > > could see it at SDK console) but it does not save other information. > > > Am I missing any point? > > Thanks for helps in advance. > > > -- > > You received this message because you are subscribed to the Google Groups > > "Google App Engine" group. > > To post to this group, send email to google-appengine@googlegroups.com. > > To unsubscribe from this group, send email to > > google-appengine+unsubscr...@googlegroups.com. > > For more options, visit this group > > athttp://groups.google.com/group/google-appengine?hl=en. -- You received this message because you are subscribed to the Google Groups "Google App Engine" group. To post to this group, send email to google-appengine@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
[google-appengine] Re: Blobstore file upload with other form values
I have to retract my previous post... this does appear to be working for me. I can use "self.request.get('description')" to retrieve the text description form field. My previous problem was that name='descripton' was spelled wrong in my html form (missing the last 'i')... doh! I think your issue is that you lose your "self.response.out.write(N)" content when you redirect via "return self.redirect('/')"... that response body content won't survive the redirect (the redirect will provide its own content). If you need to return the submitted N and S content then perhaps you could redirect to a URL that takes the 'a' object key as a parameter "self.redirect('/' + urllib.quote(a.key()))". Of course you'd have to setup your handler to accept the parameter... but then you could re-retrieve 'a' object in the handler via a datastore get such as "a = db.get(a_key)"... assuming 'a_key' is the name of the parameter. On Feb 13, 1:54 am, theone wrote: > I think you are right about BlobstoreUploadHandler limitations. When I > tried something like: > class X(db.Model): > N = db.StringProperty() > S = db.StringProperty() > F = blobstore.BlobReferenceProperty() > > class Upload(blobstore_handlers.BlobstoreUploadHandler): > def post(self): > upload_files = self.get_uploads('file') > a=upload_files[0] > N = self.request.get('name') > S = self.request.get('sname') > if S: > m=N + S > else: > m=S + N > self.response.out.write(N) > self.response.out.write(S) > a=X(N=m, S=S, F=a) > a.put() > return self.redirect('/') > > It worked partly. I mean I put my model to datastore and file to > blobstore. However, it does not writes the thing like: > self.response.out.write(N). What I understand here we cannot use > everything in BlobstoreUploadHandler. > > Also if you request the form fields, it does not work. -- You received this message because you are subscribed to the Google Groups "Google App Engine" group. To post to this group, send email to google-appengine@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
[google-appengine] Re: Blobstore file upload with other form values
I don't need to return the values. My problem is that while I am able to send file with a few form fields, It gives an error using many fields: w=upload_files[0] IndexError: list index out of range INFO 2011-02-13 07:43:10,884 dev_appserver_blobstore.py:328] Upload handler returned 500 ERROR2011-02-13 07:43:10,884 dev_appserver_blobstore.py:341] Invalid upload handler response. Only 301, 302 and 303 statuses are permitted and it may not have a content body. INFO 2011-02-13 07:43:10,910 dev_appserver.py:3317] "POST /_ah/ upload/agZlcGN2ZGJyHAsSFV9fQmxvYlVwbG9hZFNlc3Npb25fXxjFAgw HTTP/1.1" 500 - In both cases I use the same definitions: upload_files = self.get_uploads('file') w=upload_files[0] On Feb 13, 9:35 am, Doug Anderson wrote: > I have to retract my previous post... this does appear to be working > for me. I can use "self.request.get('description')" to retrieve the > text description form field. My previous problem was that > name='descripton' was spelled wrong in my html form (missing the last > 'i')... doh! > > I think your issue is that you lose your "self.response.out.write(N)" > content when you redirect via "return self.redirect('/')"... that > response body content won't survive the redirect (the redirect will > provide its own content). If you need to return the submitted N and S > content then perhaps you could redirect to a URL that takes the 'a' > object key as a parameter "self.redirect('/' + > urllib.quote(a.key()))". Of course you'd have to setup your handler > to accept the parameter... but then you could re-retrieve 'a' object > in the handler via a datastore get such as "a = db.get(a_key)"... > assuming 'a_key' is the name of the parameter. > > On Feb 13, 1:54 am, theone wrote: > > > > > > > > > I think you are right about BlobstoreUploadHandler limitations. When I > > tried something like: > > class X(db.Model): > > N = db.StringProperty() > > S = db.StringProperty() > > F = blobstore.BlobReferenceProperty() > > > class Upload(blobstore_handlers.BlobstoreUploadHandler): > > def post(self): > > upload_files = self.get_uploads('file') > > a=upload_files[0] > > N = self.request.get('name') > > S = self.request.get('sname') > > if S: > > m=N + S > > else: > > m=S + N > > self.response.out.write(N) > > self.response.out.write(S) > > a=X(N=m, S=S, F=a) > > a.put() > > return self.redirect('/') > > > It worked partly. I mean I put my model to datastore and file to > > blobstore. However, it does not writes the thing like: > > self.response.out.write(N). What I understand here we cannot use > > everything in BlobstoreUploadHandler. > > > Also if you request the form fields, it does not work. -- You received this message because you are subscribed to the Google Groups "Google App Engine" group. To post to this group, send email to google-appengine@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
[google-appengine] Re: Blobstore file upload with other form values
Thank you. I solved the problem. In my html form I forgot to put enctype="multipart/form-data". It seems working now. On Feb 13, 9:12 pm, Robert Kluin wrote: > Hi, > You're getting the IndexError because get_uploads is returning an > empty list, which means there are no blob-info records for the 'file' > field. > > Your other error is because BlobstoreUploadHandler only allows > redirects. Like Doug suggests, you'll need to redirect to another > page to output something. > > Robert > > > > > > > > On Sun, Feb 13, 2011 at 02:51, theone wrote: > > I don't need to return the values. My problem is that while I am able > > to send file with a few form fields, It gives an error using many > > fields: > > w=upload_files[0] > > IndexError: list index out of range > > INFO 2011-02-13 07:43:10,884 dev_appserver_blobstore.py:328] > > Upload handler returned 500 > > ERROR 2011-02-13 07:43:10,884 dev_appserver_blobstore.py:341] > > Invalid upload handler response. Only 301, 302 and 303 statuses are > > permitted and it may not have a content body. > > INFO 2011-02-13 07:43:10,910 dev_appserver.py:3317] "POST /_ah/ > > upload/agZlcGN2ZGJyHAsSFV9fQmxvYlVwbG9hZFNlc3Npb25fXxjFAgw HTTP/1.1" > > 500 - > > > In both cases I use the same definitions: > > upload_files = self.get_uploads('file') > > w=upload_files[0] > > > On Feb 13, 9:35 am, Doug Anderson wrote: > >> I have to retract my previous post... this does appear to be working > >> for me. I can use "self.request.get('description')" to retrieve the > >> text description form field. My previous problem was that > >> name='descripton' was spelled wrong in my html form (missing the last > >> 'i')... doh! > > >> I think your issue is that you lose your "self.response.out.write(N)" > >> content when you redirect via "return self.redirect('/')"... that > >> response body content won't survive the redirect (the redirect will > >> provide its own content). If you need to return the submitted N and S > >> content then perhaps you could redirect to a URL that takes the 'a' > >> object key as a parameter "self.redirect('/' + > >> urllib.quote(a.key()))". Of course you'd have to setup your handler > >> to accept the parameter... but then you could re-retrieve 'a' object > >> in the handler via a datastore get such as "a = db.get(a_key)"... > >> assuming 'a_key' is the name of the parameter. > > >> On Feb 13, 1:54 am, theone wrote: > > >> > I think you are right about BlobstoreUploadHandler limitations. When I > >> > tried something like: > >> > class X(db.Model): > >> > N = db.StringProperty() > >> > S = db.StringProperty() > >> > F = blobstore.BlobReferenceProperty() > > >> > class Upload(blobstore_handlers.BlobstoreUploadHandler): > >> > def post(self): > >> > upload_files = self.get_uploads('file') > >> > a=upload_files[0] > >> > N = self.request.get('name') > >> > S = self.request.get('sname') > >> > if S: > >> > m=N + S > >> > else: > >> > m=S + N > >> > self.response.out.write(N) > >> > self.response.out.write(S) > >> > a=X(N=m, S=S, F=a) > >> > a.put() > >> > return self.redirect('/') > > >> > It worked partly. I mean I put my model to datastore and file to > >> > blobstore. However, it does not writes the thing like: > >> > self.response.out.write(N). What I understand here we cannot use > >> > everything in BlobstoreUploadHandler. > > >> > Also if you request the form fields, it does not work. > > > -- > > You received this message because you are subscribed to the Google Groups > > "Google App Engine" group. > > To post to this group, send email to google-appengine@googlegroups.com. > > To unsubscribe from this group, send email to > > google-appengine+unsubscr...@googlegroups.com. > > For more options, visit this group > > athttp://groups.google.com/group/google-appengine?hl=en. -- You received this message because you are subscribed to the Google Groups "Google App Engine" group. To post to this group, send email to google-appengine@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
Re: [google-appengine] Re: Blobstore file upload with other form values
Hi, You're getting the IndexError because get_uploads is returning an empty list, which means there are no blob-info records for the 'file' field. Your other error is because BlobstoreUploadHandler only allows redirects. Like Doug suggests, you'll need to redirect to another page to output something. Robert On Sun, Feb 13, 2011 at 02:51, theone wrote: > I don't need to return the values. My problem is that while I am able > to send file with a few form fields, It gives an error using many > fields: > w=upload_files[0] > IndexError: list index out of range > INFO 2011-02-13 07:43:10,884 dev_appserver_blobstore.py:328] > Upload handler returned 500 > ERROR 2011-02-13 07:43:10,884 dev_appserver_blobstore.py:341] > Invalid upload handler response. Only 301, 302 and 303 statuses are > permitted and it may not have a content body. > INFO 2011-02-13 07:43:10,910 dev_appserver.py:3317] "POST /_ah/ > upload/agZlcGN2ZGJyHAsSFV9fQmxvYlVwbG9hZFNlc3Npb25fXxjFAgw HTTP/1.1" > 500 - > > In both cases I use the same definitions: > upload_files = self.get_uploads('file') > w=upload_files[0] > > > > On Feb 13, 9:35 am, Doug Anderson wrote: >> I have to retract my previous post... this does appear to be working >> for me. I can use "self.request.get('description')" to retrieve the >> text description form field. My previous problem was that >> name='descripton' was spelled wrong in my html form (missing the last >> 'i')... doh! >> >> I think your issue is that you lose your "self.response.out.write(N)" >> content when you redirect via "return self.redirect('/')"... that >> response body content won't survive the redirect (the redirect will >> provide its own content). If you need to return the submitted N and S >> content then perhaps you could redirect to a URL that takes the 'a' >> object key as a parameter "self.redirect('/' + >> urllib.quote(a.key()))". Of course you'd have to setup your handler >> to accept the parameter... but then you could re-retrieve 'a' object >> in the handler via a datastore get such as "a = db.get(a_key)"... >> assuming 'a_key' is the name of the parameter. >> >> On Feb 13, 1:54 am, theone wrote: >> >> >> >> >> >> >> >> > I think you are right about BlobstoreUploadHandler limitations. When I >> > tried something like: >> > class X(db.Model): >> > N = db.StringProperty() >> > S = db.StringProperty() >> > F = blobstore.BlobReferenceProperty() >> >> > class Upload(blobstore_handlers.BlobstoreUploadHandler): >> > def post(self): >> > upload_files = self.get_uploads('file') >> > a=upload_files[0] >> > N = self.request.get('name') >> > S = self.request.get('sname') >> > if S: >> > m=N + S >> > else: >> > m=S + N >> > self.response.out.write(N) >> > self.response.out.write(S) >> > a=X(N=m, S=S, F=a) >> > a.put() >> > return self.redirect('/') >> >> > It worked partly. I mean I put my model to datastore and file to >> > blobstore. However, it does not writes the thing like: >> > self.response.out.write(N). What I understand here we cannot use >> > everything in BlobstoreUploadHandler. >> >> > Also if you request the form fields, it does not work. > > -- > You received this message because you are subscribed to the Google Groups > "Google App Engine" group. > To post to this group, send email to google-appengine@googlegroups.com. > To unsubscribe from this group, send email to > google-appengine+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/google-appengine?hl=en. > > -- You received this message because you are subscribed to the Google Groups "Google App Engine" group. To post to this group, send email to google-appengine@googlegroups.com. To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.