curl
コマンドでOKであるならば、curl
コマンドでのHTTPリクエストをなるべく真似れば良いはずです。ご提示のcurl
コマンドのHTTPリクエストをnc
コマンドで待ち受けて見てみると、以下のようになります。分かりやすく、img.jpg
ファイルはダミーのものにしておきます。
bash
1ls -l imagepath/img.jpg
2-rwxrwxrwx 1 user01 user01 30 Jul 14 12:28 imagepath/img.jpg
3$ cat imagepath/img.jpg
4123456789
5123456789
6123456789
7$
8
9$ nc -l 5000
10POST /model/predictor HTTP/1.1
11Host: localhost:5000
12User-Agent: curl/7.58.0
13Accept: */*
14Content-Length: 216
15Content-Type: multipart/form-data; boundary=------------------------cc991f1cdd79fdee
16
17--------------------------cc991f1cdd79fdee
18Content-Disposition: form-data; name="image"; filename="img.jpg"
19Content-Type: image/jpeg
20
21123456789
22123456789
23123456789
24
25--------------------------cc991f1cdd79fdee--
MIMEのマルチパートの部分で、Content-Type: image/jpeg
があるのが分かります。質問者さんのオリジナルのPython3コードでは、この部分が存在しませんでした。ですので、Content-Type: image/jpeg
を追加するようにコードを修正します。
Python3
1import requests
2
3url = 'http://localhost:5000/model/predictor'
4
5file_data = open('imagepath/img.jpg', 'rb').read()
6files = {'image': ('img.jpg', file_data, 'image/jpeg')}
7res = requests.post(url, files=files)
8
9print(res)
10print(res.reason)
11print(res.text)
12
このPython3スクリプトを実行すると、Content-Type: image/jpeg
が追加され、curl
実行時のものとほぼ等価になります。
$ nc -l 5000
POST /model/predictor HTTP/1.1
Host: localhost:5000
User-Agent: python-requests/2.18.4
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
Content-Length: 200
Content-Type: multipart/form-data; boundary=de917b72bc0d4b31b4df7adb786a3c8f
--de917b72bc0d4b31b4df7adb786a3c8f
Content-Disposition: form-data; name="image"; filename="img.jpg"
Content-Type: image/jpeg
123456789
123456789
123456789
--de917b72bc0d4b31b4df7adb786a3c8f--
これでもまだ問題が解決しないのであれば、もう少しHTTPリクエストのヘッダーフィールドやマルチパート部分を修正する必要があるかと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/14 04:15