2009-09-17 9 views
5

मैं GAE में किसी ऐप से torrage.com पर एक फ़ाइल भेजने की कोशिश कर रहा हूं। फ़ाइल अपलोड करने के बाद फ़ाइल को स्मृति में संग्रहीत किया जाता है।Google App Engine urlfetch POST फ़ाइलों को

मैं एपीआई यहाँ उपलब्ध का उपयोग कर इस फ़ाइल को पोस्ट करने में सक्षम होना चाहते हैं: http://torrage.com/automation.php लेकिन मैं undestanding कैसे पोस्ट का मुख्य भाग इनकोडिंग किया जाना चाहिए कुछ समस्या हो रहा है, सबसे मैं एपीआई से मिला एक "फ़ाइल है खाली "संदेश।

उत्तर

0

पोस्ट अनुरोध बनाने के लिए पाइथन के urllib2 मॉड्यूल का उपयोग क्यों न करें, जैसे कि वे PHP के लिए एक उदाहरण में दिखाते हैं।

import urrlib, urllib2 
data = (
     ('name', 'torrent'), 
     ('type', 'application/x-bittorrent'), 
     ('file', '/path/to/your/file.torrent'), 
) 
request = urllib2.urlopen('http://torrage.com/autoupload.php', urllib.urlencode(data)) 
+0

वहाँ App इंजन में कोई भी फ़ाइलें है, मैं स्मृति में उपयोग करने के लिए मैं क्या है भेजने के लिए एक फ़ाइल है की जरूरत है। – medecau

+0

क्योंकि PHP उदाहरण कुछ PHP कार्यक्षमता का उपयोग करता है जो एक मल्टीपार्ट/फॉर्म-डेटा अनुरोध बनाता है, _not_ फॉर्म-एन्कोडेड अनुरोध जो आपका उदाहरण बनाता है। –

2

मैं बहुत भ्रामक और परस्पर विरोधी नमूना सी कोड वे भी आपूर्ति के साथ (के रूप में सोप एक के खिलाफ) पोस्ट इंटरफेस पर torrage के एपीआई दस्तावेज़ ढूंढने: यह कुछ इस तरह होगा। ऐसा लगता है कि PHP पोस्ट के उनके ऑनलाइन उदाहरण में वे फ़ाइल की सामग्री नहीं भेज रहे हैं (जैसे ऊपर @ केंडर का उत्तर इसे भेज नहीं रहा है) जबकि वे इसे एसओएपी उदाहरणों में भेज रहे हैं और उदाहरण सी कोड में भेज रहे हैं।

सी नमूना (कैसे वे हेडर कि आप urlfetch.fetch को गुजर होगी गणना) के प्रासंगिक हिस्सा है:

snprintf(formdata_header, sizeof(formdata_header) - 1, 
    "Content-Disposition: form-data; name=\"torrent\"; filename=\"%s\"\n" 
    "Content-Type: " HTTP_UPLOAD_CONTENT_TYPE "\n" 
    "\n", 
    torrent_file); 
    http_content_len = 2 + strlen(content_boundary) + 1 + strlen(formdata_header) + st.st_size + 1 + 2 + strlen(content_boundary) + 3; 
    LTdebug("http content len %u\n", http_content_len); 
    snprintf(http_req, sizeof(http_req) - 1, 
    "POST /%s HTTP/1.1\n" 
    "Host: %s\n" 
    "User-Agent: libtorrage/" LTVERSION "\n" 
    "Connection: close\n" 
    "Content-Type: multipart/form-data; boundary=%s\n" 
    "Content-Length: %u\n" 
    "\n", 
    cache_uri, cache_host, content_boundary, http_content_len); 

"अनुप्रयोग/x-बिटटोरेंट" HTTP_UPLOAD_CONTENT_TYPE है। st.st_size मेमोरी बफर में सभी फ़ाइल के डेटा के साथ बाइट्स की संख्या है (सी नमूना फ़ाइल से उस डेटा को पढ़ता है, लेकिन इससे कोई फ़र्क नहीं पड़ता कि आप इसे स्मृति में कैसे प्राप्त करते हैं, जब तक आप इसका आकार जानते हों)। content_boundary एक स्ट्रिंग है जो फ़ाइल की सामग्री में मौजूद नहीं है, वे इसे के रूप में बनाते हैं, प्रत्येक %u एक यादृच्छिक संख्या द्वारा प्रतिस्थापित किया जाता है (तब तक दोहराव संख्याओं पर उस स्ट्रिंग को हिट करता है जो फ़ाइल में मौजूद नहीं होता है)। अंत में, के बाद शरीर (HTTP सॉकेट खोलने और अन्य शीर्ष लेख भेजने के बाद) वे के रूप में लिखें इस प्रकार है:

if (write_error == 0) if (write(sock, "--", 2) <= 0) write_error = 1; 
    if (write_error == 0) if (write(sock, content_boundary, strlen(content_boundary)) <= 0) write_error = 1; 
    if (write_error == 0) if (write(sock, "\n", 1) <= 0) write_error = 1; 
    if (write_error == 0) if (write(sock, formdata_header, strlen(formdata_header)) <= 0) write_error = 1; 
    if (write_error == 0) if (write(sock, filebuf, st.st_size) <= 0) write_error = 1; 
    if (write_error == 0) if (write(sock, "\n--", 3) <= 0) write_error = 1; 
    if (write_error == 0) if (write(sock, content_boundary, strlen(content_boundary)) <= 0) write_error = 1; 
    if (write_error == 0) if (write(sock, "--\n", 3) <= 0) write_error = 1; 

जहां filebuf फ़ाइल की सामग्री के साथ बफर है।

शायद ही तेज और सरल, लेकिन मुझे उम्मीद है कि urlfetch.fetch के लिए तर्क बनाने के लिए यहां काम करने के लिए पर्याप्त जानकारी है (urllib.urlopen के लिए उन्हें बनाना उतना ही कठिन होगा, क्योंकि समस्या बिल्कुल दस्तावेज की कमी है क्या हेडर और किस सामग्री और आपको एन्कोड किए जाने की आवश्यकता है - और मुझे अच्छी तरह से प्रलेखित जानकारी को यहां जो प्रस्तुत कर रहा है उससे उलटा इंजीनियर होना चाहिए, मुझे लगता है)।

वैकल्पिक रूप से, urlfetch के माध्यम से एक SOAP अनुरोध को हैक करना संभव हो सकता है; कार्सन के मामले में उनके प्रयासों, कठिनाइयों और सफलता के लंबे पद के लिए here देखें। और शुभकामनाएं!

0

सी कोड से निर्णय लेते हुए, यह "मल्टीपार्ट/फॉर्म-डेटा" प्रारूप का उपयोग कर रहा है, जो बहुत जटिल है और कुछ गलत प्राप्त करना बहुत आसान है। मैं इस तरह के पोस्ट बॉडी को हाथ से कोड नहीं करूँगा।

मैंने इस ब्लॉग से फ़ंक्शन का उपयोग किया और यह मेरे लिए स्टैंड-अलोन प्रोग्राम से काम करता था। आप इसे एप्लिकेशन इंजन में आजमाइए चाहते हो सकता है,

http://peerit.blogspot.com/2007/07/multipartposthandler-doesnt-work-for.html