2012-03-02 7 views
1

(大)ランダムなコンテンツをHTTPエンドポイントにアップロードします。私はそれを作成し、それを送信し、再び使用されることはありません。だから、私は一時ファイルに保存し、{ 'file':open() }を使ってスキップしたいと思います。私はmultipartの代わりにform-urlencodedも使う必要があります。
私はpycurlとそのREADFUNCTIONオプションを使用していましたが、pycurlに依存したくありません。urllib2上流への書き込み

これを実現することは可能ですか?urllib2

私はこのコードを持っている:

def upload(): 
    url = 'http://localhost:9999/' 
    values = {'name' : 'Michael Foord', 
      'location' : 'Northampton', 
      'language' : open(file).read() } 
    data = urllib.urlencode(values) 
    req = urllib2.Request(url, data) 
    response = urllib2.urlopen(req) 
    the_page = response.read() 

をしかし、そのままでが定義されている場合、ファイル全体が読み込まれます。
ファイルのサイズが1Gbだった場合、これはうまくいかない(私が誤解しない限り)。また、ランダムに埋め込まれた1Gbファイルを作成する必要はありません。


[OK]をダニエルが述べたように、私はたStringIOをサブクラス化することができますし、(読み込み中にランダムなデータを作成する)が、どのように私はurllib2のは(読み込みをお願いしますん)チャンクアップロード中一度にすべてをメモリに入れるのではなく、より具体的にするための試みにおいて


、私が本当に欲しいと、私は、その後に書き込みができることをJavaでurlConnectionInstance.getOutputStream()のようなものです。それは実際に私はあなたが困難を抱えている場所を正確にわからないんだけど、それはあなたのように聞こえる...

答えて

2

http://docs.python.org/library/httplib.html#httplib.HTTPConnection.request

..Alternatively、それはファイルの内容が送信される場合には開かれたファイルオブジェクトであってもよいです。このファイルオブジェクトはfileno()とread()メソッドをサポートする必要があります。 ..

+0

Danielによって提案されたStringIOと一緒に、これはまさに私が探していたものです。質問で_urllib2_を指定したにもかかわらず、全体的な点は_urllib2_ではなく標準ライブラリを使用していました(私の悪い)。ありがとう! –

2

をアップロード・ストリーム内のデータをダンプしているながら、私自身のストリームから読み取るurllib2のを指示するか、いくつかの方法StringIOオブジェクト内にイメージを作成する必要があります。これはファイルのように動作する文字列です。 read()メソッドを使用して、このデータを標準のURLエンコード要求データの一部として含めることができます。

+0

私は確かに説明できませんでした(または私はpython read()を理解できません)。私が理解しているように、 'values = {'something' = open(file、 'r')。read()}'(または_StringIO_オブジェクトで)と入力すると、_values_ dictionaryをインスタンス化した時点でデータ全体がロードされます。私が望むのは、urllib2に何かを渡して、_after_接続してすぐにストリームに書き込めるようにすることです。しかし、私はそれをデータのまとまりでフィードするので、メモリに保持されません。 1Gbのランダムデータをアップロードするような... –

0

私の主な問題は、urllib.urlencodeはあなたのアプローチをサポートしていないと思います。適切にエンコードされたデータの塊を生成するread(size)メソッドを持つ独自のクラスを作成する場合は、dataパラメータで機能するはずです。しかし、これを試していない。あなたはPythonの標準ライブラリにhttplibモジュールを使用することができます

関連する問題