1. ホーム
  2. python

[解決済み] pythonのリクエストでファイルをアップロードするには?

2022-03-10 21:31:26

質問

Pythonのリクエストライブラリを使って、ファイルをアップロードするという簡単な作業を行っています。Stack Overflowを検索しましたが、誰も同じ問題、すなわち、ファイルがサーバーによって受信されないという問題を抱えていないようでした。

import requests
url='http://nesssi.cacr.caltech.edu/cgi-bin/getmulticonedb_release2.cgi/post'
files={'files': open('file.txt','rb')}
values={'upload_file' : 'file.txt' , 'DB':'photcat' , 'OUT':'csv' , 'SHORT':'short'}
r=requests.post(url,files=files,data=values)

upload_file'キーワードの値を私のファイル名で埋めています。空白にしておくと、次のように表示されるからです。

Error - You must select a file to upload!

そして今、私は

File  file.txt  of size    bytes is  uploaded successfully!
Query service results:  There were 0 lines.

これは、ファイルが空の場合のみ出てきます。どうすればうまく送信できるのか困っています。このウェブサイトに行き、手動でフォームに入力すると、マッチしたオブジェクトの素敵なリストが返されるので、ファイルが機能することは分かっています。 私は本当にすべてのヒントを感謝します。

関連する他のスレッドもあります(ただし、私の問題には答えていません)。

解決方法は?

もし upload_file がファイルを意味する場合は、使用します。

files = {'upload_file': open('file.txt','rb')}
values = {'DB': 'photcat', 'OUT': 'csv', 'SHORT': 'short'}

r = requests.post(url, files=files, data=values)

requests は、マルチパートフォームの POST ボディに upload_file の内容に設定されています。 file.txt ファイルを作成します。

ファイル名は、特定のフィールドのMIMEヘッダーに含まれることになります。

>>> import requests
>>> open('file.txt', 'wb')  # create an empty demo file
<_io.BufferedWriter name='file.txt'>
>>> files = {'upload_file': open('file.txt', 'rb')}
>>> print(requests.Request('POST', 'http://example.com', files=files).prepare().body.decode('ascii'))
--c226ce13d09842658ffbd31e0563c6bd
Content-Disposition: form-data; name="upload_file"; filename="file.txt"


--c226ce13d09842658ffbd31e0563c6bd--

注意 filename="file.txt" パラメータを使用します。

にタプルを使用することができます。 files マッピングの値は、2つから4つの要素で構成されます。最初の要素はファイル名で、その後にコンテンツが続き、オプションでcontent-typeヘッダ値と追加のヘッダのマッピングがあります。

files = {'upload_file': ('foobar.txt', open('file.txt','rb'), 'text/x-spam')}

これは、代替のファイル名とコンテントタイプを設定し、オプションのヘッダーを省きます。

を意味するのであれば POSTボディ全体 をファイルから取得する場合 (他のフィールドを指定しない場合) には、このメソッドは使用しないでください。 files パラメータとして直接ファイルを投稿します。 data . 次に Content-Type ヘッダも設定されます。参照 Python のリクエスト - ファイルからの POST データ .