2009-09-17 9 views
5

GAEのアプリケーションからtorrage.comにファイルを送信しようとしています。 ファイルは、ユーザーアップロードから受信された後にメモリに格納されます。Google App EngineのPOSTへのURLフェイル

私はここに利用できるAPIを使用してこのファイルを投稿できるようにしたいと思います: http://torrage.com/automation.phpが、私はポストのボディがエンコードする方法をundestandingいくつかの問題が生じています、私はAPIから得たほとんどは、「ファイルです空 "のメッセージ。

答えて

0

PHPの例に示すように、Pythonのurllib2モジュールを使用してPOSTリクエストを作成するだけではいかがですか。

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 Engineの中で何のファイルはありません、それをアプリエンジンで試してみることがあります、私はファイルを持って送信するためにメモリに私が持っているものを使用する必要があります。 – medecau

+0

PHPの例では、multipart/form-dataリクエストを構築するPHP機能を使用しているため、サンプルで構築されたフォームエンコードされたリクエストはありません。 –

2

私は、彼らはまた、供給サンプルCコードでかなり混乱と矛盾POSTインターフェース(SOAP 1とは反対に)上のtorrageのAPIのドキュメントを見つける:それはこのようなものになるだろう。 PHPの投稿のオンラインの例では、SOAPの例とCコードの例で、ファイルの内容を送信していないようです(上記の@ kenderの答えは送信していないのと同じです)。

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を乱数で置き換えます(ファイル内に存在しない2つの乱数にヒットするまで繰り返します)。

filebufは、ファイルの内容をバッファである
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; 

を次のように最後に、(HTTPソケットを開き、他のヘッダを送信した後)、ポスト本体は、彼らが書きます。

ほとんどシャープでシンプルですが、私はこの問題は、まさにに関するドキュメントの不足があるので、十分な情報が、同じように難しいだろうurllib.urlopenのためにそれらを構築するurlfetch.fetch(の引数を構築する方法を動作するようにここにあります願っていますどのヘッダーやコンテンツ、どのようにコード化されている必要がありますか?そして、よく書かれていない情報は、ここで私が提示しているものからリバースエンジニアリングする必要があります。

また、urlfetchを使用してSOAPリクエストをハッキングすることもできます。カーソンの長年の彼の試み、難しさと成功のためのhereを参照してください。そして成功を祈る!

0

Cコードから判断すると、 "multipart/form-data"形式を使用しています。これは非常に複雑で、何か間違っていることは非常に簡単です。私はそのような郵便体を手書きしません。

私はこのブログの機能を使用しており、スタンドアロンプ​​ログラムから私のために働いていました。あなたは

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

関連する問題