2012-04-08 16 views
5

काम नहीं कर रहा है। मैं एक ऐपेंगिन ऐप से डॉटक्लाउड पर होस्ट किए गए बाहरी (डीजेंगो) एपीआई में एक मल्टीपार्ट पोस्ट अनुरोध भेजने का प्रयास कर रहा हूं। अनुरोध कुछ टेक्स्ट और एक फ़ाइल (पीडीएफ) भी शामिल है और निम्नलिखित कोडएपेंगिन पायथन में मल्टीपार्ट/फॉर्म-डेटा के साथ पोस्ट अनुरोध

from google.appengine.api import urlfetch 
from poster.encode import multipart_encode 
from libs.poster.streaminghttp import register_openers 

register_openers() 
file_data = self.request.POST['file_to_upload'] 
the_file = file_data 
send_url = "http://127.0.0.1:8000/" 
values = { 
      'user_id' : '12341234', 
      'the_file' : the_file 
      } 

data, headers = multipart_encode(values) 
headers['User-Agent'] = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' 
data = str().join(data) 
result = urlfetch.fetch(url=send_url, payload=data, method=urlfetch.POST, headers=headers) 
logging.info(result.content) 

इस विधि AppEngine चलाता देता है चेतावनी निम्नलिखित का उपयोग कर भेज दिया जाता है (मुझे यकीन है कि अगर यह मेरी समस्या से संबंधित है नहीं कर रहा हूँ)

Stripped prohibited headers from URLFetch request: ['Content-Length'] 

और Django निम्न त्रुटि

<class 'django.utils.datastructures.MultiValueDictKeyError'>"Key 'the_file' not found in <MultiValueDict: {}>" 

Django कोड के माध्यम से भेजता है बहुत आसान है और काम करता है जब मैं डाकिया chrome एक्सटेंशन का उपयोग एक फाइल भेजने के लिए।

@csrf_exempt 
def index(request): 
    try: 
     user_id = request.POST["user_id"] 
     the_file = request.FILES["the_file"] 
     return HttpResponse("OK") 
    except: 
     return HttpResponse(sys.exc_info()) 

अगर मैं

print request.POST.keys() 

जोड़ने मैं एक शब्दकोश का संकेत है कि फ़ाइल एक फ़ाइल के रूप में भेजा जा रहा है user_id और the_file युक्त मिलता है। अगर मैं FILES के लिए ऐसा करता हूं iee

print request.FILES.keys()  

मुझे खाली सूची मिलती है []।

संपादित करें 1:

मैं someone1 के सुझाव लेकिन यह अभी भी विफल लागू करने के लिए मेरे सवाल बदल दिया है। मैंने ग्लेन को भेजे गए लिंक द्वारा अनुशंसित हेडर जोड़े को भी शामिल किया, लेकिन कोई खुशी नहीं।

संपादित करें 2:

मैं भी

the_file = file_data.file 
the_file = file_data.file.read() 

के रूपांतरों के रूप में the_file भेजने की कोशिश की है लेकिन मैं एक ही त्रुटि मिलती है।

संपादित करें 3:

मैं भी

the_file = request.POST["the_file"] 

करने के लिए मेरे Django एप्लिकेशन संपादन की कोशिश की है लेकिन जब मैं

path = default_storage.save(file_location, ContentFile(the_file.read())) 

यह

के साथ विफल साथ स्थानीय रूप से फ़ाइल को बचाने की कोशिश
<type 'exceptions.AttributeError'>'unicode' object has no attribute 'read'<traceback object at 0x101f10098> 

इसी तरह अगर मैं पहुँच the_file.file कोशिश (के रूप में मैं अपने ऐप्लिकेशन इंजन अनुप्रयोग में उपयोग कर सकते हैं) यह मुझसे कहता है

<type 'exceptions.AttributeError'>'unicode' object has no attribute 'file'<traceback object at 0x101f06d40> 

उत्तर

8

यहां कुछ कोड है जो मैंने स्थानीय रूप से परीक्षण किया है जो चाल चलाना चाहिए (मैंने webapp2 की तुलना में एक अलग हैंडलर का उपयोग किया लेकिन इसे webapp2 में संशोधित करने का प्रयास किया।GAE पर

अपनी पोस्ट हैंडलर में: आप यहां http://atlee.ca/software/poster/ पाया पोस्टर lib) की आवश्यकता होगी

from google.appengine.api import urlfetch 
from poster.encode import multipart_encode 
payload = {} 
payload['test_file'] = self.request.POST['test_file'] 
payload['user_id'] = self.request.POST['user_id'] 
to_post = multipart_encode(payload) 
send_url = "http://127.0.0.1:8000/" 
result = urlfetch.fetch(url=send_url, payload="".join(to_post[0]), method=urlfetch.POST, headers=to_post[1]) 
logging.info(result.content) 

सुनिश्चित करें कि आपके HTML प्रपत्र method="POST" enctype="multipart/form-data" शामिल करें। उम्मीद है की यह मदद करेगा!

संपादित करें: मैं webapp2 हैंडलर उपयोग करने की कोशिश और जिस तरह फ़ाइलों सेवा कर रहे हैं एहसास हुआ की तुलना में कैसे ढांचे मैं काम करता है (Kay) के साथ परीक्षण करने के लिए प्रयोग किया जाता है अलग हैं। यहां अद्यतन कोड है जो चाल (उत्पादन पर परीक्षण) करना चाहिए:

import webapp2 
from google.appengine.api import urlfetch 
from poster.encode import multipart_encode, MultipartParam 

class UploadTest(webapp2.RequestHandler): 
    def post(self): 
    payload = {} 
    file_data = self.request.POST['test_file'] 
    payload['test_file'] = MultipartParam('test_file', filename=file_data.filename, 
              filetype=file_data.type, 
              fileobj=file_data.file) 
    payload['name'] = self.request.POST['name'] 
    data,headers= multipart_encode(payload) 
    send_url = "http://127.0.0.1:8000/" 
    t = urlfetch.fetch(url=send_url, payload="".join(data), method=urlfetch.POST, headers=headers) 
    self.response.headers['Content-Type'] = 'text/plain' 
    self.response.out.write(t.content) 
    def get(self): 
    self.response.out.write(""" 
    <html> 
     <head> 
      <title>File Upload Test</title> 
     </head> 
     <body> 
      <form action="" method="POST" enctype="multipart/form-data"> 
       <input type="text" name="name" /> 
       <input type="file" name="test_file" /> 
       <input type="submit" value="Submit" /> 
      </form> 
     </body> 
    </html>""") 
+0

हाय, कोड के लिए धन्यवाद। यहां दायर एपेंगिन में एक बग है (http://code.google.com/p/googleappengine/issues/detail?id=627) जो multipart_encode विधि की उपयोगिता को सीमित करता है। मैं अभी एक कामकाज का परीक्षण कर रहा हूँ। – user714852

+0

मुझे पूरी तरह से यकीन नहीं है कि आप जो भी पूरा करने की कोशिश कर रहे हैं उसके लिए बग आपको प्रभावित करेगा। असल में, मुझे नहीं पता कि वह बग अभी भी मान्य है क्योंकि आप अपने डेटा को एन्कोड कर सकते हैं और इसे POST urlfetch में पेलोड के रूप में पैकेज कर सकते हैं जैसे उदाहरण कोड में मैंने पोस्टर lib का उपयोग किया है। – someone1

+0

बिल्कुल सही! संपादित संस्करण बिल्कुल आवश्यक रूप से काम करता है - इसके साथ आपकी मदद के लिए बहुत बहुत धन्यवाद, यह मुझे व्याकुलता के लिए चला रहा था! – user714852

संबंधित मुद्दे