我想從GAE中的應用程序發送文件到torrage.com。 從用戶上傳收到文件後,該文件存儲在內存中。谷歌應用程序引擎urlfetch POST文件
我希望能夠利用這裏提供的API來發布此文件: http://torrage.com/automation.php,但我有一些問題undestanding如何帖子的正文應進行編碼,我從API得到的最多的是「文件空「消息。
我想從GAE中的應用程序發送文件到torrage.com。 從用戶上傳收到文件後,該文件存儲在內存中。谷歌應用程序引擎urlfetch POST文件
我希望能夠利用這裏提供的API來發布此文件: http://torrage.com/automation.php,但我有一些問題undestanding如何帖子的正文應進行編碼,我從API得到的最多的是「文件空「消息。
爲什麼不使用Python的urllib2模塊來創建POST請求,就像它們在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))
我找到POST接口上torrage的API文檔(而不是在SOAP之一)相當混亂和衝突的與樣品C代碼也供應。在我看來,在他們的PHP發佈的在線示例中,他們不會發送文件的內容(就像@ kender的上面的答案不會發送它),而是在SOAP示例和示例C代碼中發送它的內容。
C採樣(他們是如何計算你會被傳遞給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-BitTorrent的」 是HTTP_UPLOAD_CONTENT_TYPE
。 st.st_size
是包含所有文件數據的內存緩衝區中的字節數(C樣本從文件讀取數據,但只要知道其大小,無論如何將其存入內存都無關緊要)。 content_boundary
是一個不存在於文件內容中的字符串,它們將其構建爲"---------------------------%u%uLT"
,每個%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。還有祝你好運!
從C代碼判斷,它使用的是「multipart/form-data」格式,它非常複雜,很容易出錯。我不會像這樣手動編寫帖子。
我使用了這個博客的功能,它可以從獨立程序中爲我工作。你可能想給它在App Engine中一試,
http://peerit.blogspot.com/2007/07/multipartposthandler-doesnt-work-for.html
有在App Engine中沒有文件,我需要用我在內存送了一個文件。 – medecau 2009-09-17 13:39:36
由於PHP示例使用了構建多部分/表單數據請求的某些PHP功能,因此_not_表示您的示例構造的表單編碼請求。 – 2009-09-17 19:31:47