53

ファイルに関する詳細を含む JSON 文字列と共にファイルをアップロードするには、API 呼び出しを行う必要があります。

これを行うためにpython requests libを使用しようとしています:

import requests

info = {
    'var1' : 'this',
    'var2'  : 'that',
}

data = json.dumps({
    'token' : auth_token,
    'info'  : info,
})

headers = {'Content-type': 'multipart/form-data'}

files = {'document': open('file_name.pdf', 'rb')}

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

これにより、次のエラーがスローされます。

    raise ValueError("Data must not be a string.")
 ValueError: Data must not be a string

リクエストから「ファイル」を削除すると、機能します。
リクエストから「データ」を削除すると、機能します。
データを JSON としてエンコードしないと機能します。

このため、エラーは JSON データとファイルを同じリクエストで送信することに関係していると思います。

これを機能させる方法についてのアイデアはありますか?

4

6 に答える 6

28

このスレッドを参照してくださいマルチパート POST リクエストの一部として JSON を送信する方法

Content-type ヘッダーを自分で設定しないでください。pyrequests に任せて生成してください。

def send_request():
    payload = {"param_1": "value_1", "param_2": "value_2"}
    files = {
        'json': (None, json.dumps(payload), 'application/json'),
        'file': (os.path.basename(file), open(file, 'rb'), 'application/octet-stream')
    }

    r = requests.post(url, files=files)
    print(r.content)
于 2016-03-11T18:04:03.003 に答える
-1

さらに:

files = {
    'document': open('file_name.pdf', 'rb')
}

これは、ファイルがスクリプトと同じディレクトリにある場合にのみ機能します。

別のディレクトリからファイルを追加する場合は、次のようにする必要があります。

files = {
    'document': open(os.path.join(dir_path, 'file_name.pdf'), 'rb')
}

dir_pathは、「file_name.pdf」ファイルのあるディレクトリです。

しかし、複数の PDF を送信したい場合はどうすればよいでしょうか?

必要なファイルのリストを返すカスタム関数を作成するだけです (この場合、拡張子が.pdfのファイルのみが可能です)。これには、サブディレクトリ内のファイルも含まれます (ファイルを再帰的に検索します)。

def prepare_pdfs():
    return sorted([os.path.join(root, filename) for root, dirnames, filenames in os.walk(dir_path) for filename in filenames if filename.endswith('.pdf')])

次に、それを呼び出すことができます:

my_data = prepare_pdfs()

そして単純なループで:

for file in my_data:

    pdf = open(file, 'rb')

    files = {
        'document': pdf
    }

    r = requests.post(url, files=files, ...)
于 2016-11-28T12:47:15.377 に答える