2010-05-23 32 views
5

Tôi có ứng dụng AppEngine sử dụng blobstore để lưu trữ dữ liệu hình ảnh do người dùng cung cấp. Khi tôi tải hình ảnh lên ứng dụng đó từ một biểu mẫu trong Chrome, nó hoạt động tốt. Khi tôi cố gắng tải lên một hình ảnh từ một ứng dụng Android nó không thành công. Cả hai phương pháp đều hoạt động tốt nếu tôi đang chạy với máy chủ phát triển nhưng tải lên Android không hoạt động đối với dịch vụ trực tiếp.Tải lên AppEngine BlobStore không thành công với yêu cầu hoạt động trong Môi trường phát triển

Đây là yêu cầu từ Chrome:

POST /_ah/upload/?userToken=11001/AMmfu6ZCyMQQ9YdiXal3SmSXIRTQIuSRXkNc-i3JmU0fqx_kJbUJ2OMLcS2lXhVJSK4qs7regViTKzOPz5ejoZYi0nAD5o8vNltiOViQw6DZO7_byZz3Ut0/ALBNUaYAAAAAS_lusgPMAGmpPrg0BuNsJyymX-57ob4i/ HTTP/1.1 
Host: photohuntservice.appspot.com 
Connection: keep-alive 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.1.249.1064 Safari/532.5 
Referer: http://photohuntservice.appspot.com/debug_newpuzzle?userToken=11001 
Content-Length: 60360 
Cache-Control: max-age=0 
Origin: http://photohuntservice.appspot.com 
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarybl05YLmLbFRf2MzN 
Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-US,en;q=0.8 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 

------WebKitFormBoundarybl05YLmLbFRf2MzN 
Content-Disposition: form-data; name="userToken" 

11001 
------WebKitFormBoundarybl05YLmLbFRf2MzN 
Content-Disposition: form-data; name="img"; filename="Photo_020908_001.jpg" 
Content-Type: image/jpeg 

<image data> 
------WebKitFormBoundarybl05YLmLbFRf2MzN 
Content-Disposition: form-data; name="longitude" 

-122.084095 
------WebKitFormBoundarybl05YLmLbFRf2MzN 
Content-Disposition: form-data; name="latitude" 

37.422006 
------WebKitFormBoundarybl05YLmLbFRf2MzN-- 

Đây là yêu cầu từ khách hàng của tôi (được viết bằng Java trên Android, nhưng tôi không nghĩ đó là có liên quan):

POST /_ah/upload/?userToken=11001/AMmfu6Zf9an6AU4lT9UuhIpxOZyOYb1LMwimFpeSh8zr6J1sX9F2ddJW3Qlsw0kwV3oALv-TNPWRQ6g4_Dgwk0UTwF47bbc78Yl44kDeV69MydTuR3N46S4/ALBNUaYAAAAAS_mMr3CYqTg3aVBDjhRxP0DyyRdvotyG/ HTTP/1.1 
Content-Type: multipart/form-data;boundary=----WebKitFormBoundaryhdyNAhmOouRDGErG 
Cache-Control: max-age=0 
Accept: */* 
Origin: http://photohuntservice.appspot.com 
Connection: keep-alive 
Referer: http://photohuntservice.appspot.com/getuploadurl?userToken=11001 
Content-Length: 2638 
Host: photohuntservice.appspot.com 
User-Agent: Apache-HttpClient/UNAVAILABLE (java 1.4) 
Expect: 100-Continue 

------WebKitFormBoundaryhdyNAhmOouRDGErG 
Content-Disposition: form-data; name="userToken" 

11001 
------WebKitFormBoundaryhdyNAhmOouRDGErG 
Content-Disposition: form-data; name="img";filename="PhotoHunt.jpg" 
Content-Type: image/jpeg 

<image data> 
------WebKitFormBoundaryhdyNAhmOouRDGErG 
Content-Disposition: form-data; name="latitude" 

37.422006 
------WebKitFormBoundaryhdyNAhmOouRDGErG 
Content-Disposition: form-data; name="longitude" 

-122.084095 
------WebKitFormBoundaryhdyNAhmOouRDGErG-- 

Trong cả hai trường hợp, mã Python AppEngine để bắt được yêu cầu giống nhau:

class UploadPuzzle(blobstore_handlers.BlobstoreUploadHandler): 
     def post(self): 
      upload_files = self.get_uploads() 

Đầu dò là khi chạy trên production AppEngine service self.get_uploads() trả về một danh sách rỗng khi yêu cầu được thực hiện từ ứng dụng khách của tôi. Cả hai yêu cầu trả lại những gì tôi mong đợi (một danh sách có một blob_info trong đó) trên máy chủ phát triển và Chrome trả về những gì tôi mong đợi trong cả hai trường hợp.

Trả lời

11

Hóa ra vấn đề là dòng này:

Content-Disposition: form-data; name="img";filename="PhotoHunt.jpg" 

Nó nên đọc như thế này:

Content-Disposition: form-data; name="img"; filename="PhotoHunt.jpg" 

Các phân tích cú pháp cho form-data trên các máy chủ sản xuất là hơn nghiêm ngặt hơn so với một trong môi trường phát triển và yêu cầu một khoảng trống giữa dấu chấm phẩy và "filename ="

+1

Công cụ phát hiện tốt! Bạn có thể nộp lỗi cho điều đó không? –

+2

Đã làm: http://code.google.com/p/googleappengine/issues/detail?id=3273 –

+1

Điều đó @ # $%! máy chủ sản xuất. "Chắc chắn rằng không gian trước khi tên tập tin là thừa, hãy để tôi làm sạch nó", tôi nghĩ. Ồ, cái giá tôi trả cho sự gọn gàng của tôi. – drcode

-1

Tùy chọn khác có thể là do bạn đã thêm thông số URL, hoạt động bình thường, nhưng không phù hợp với thứ e cách Trình tải lên của Blobstore chuyển hướng đến servlet của bạn.

Các vấn đề liên quan