Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Upload Image using POST form data in Python-requests

I'm working with wechat APIs ... here I've to upload an image to wechat's server using this API http://admin.wechat.com/wiki/index.php?title=Transferring_Multimedia_Files

url = 'http://file.api.wechat.com/cgi-bin/media/upload?access_token=%s&type=image'%access_token files = {     'file': (filename, open(filepath, 'rb')),     'Content-Type': 'image/jpeg',     'Content-Length': l } r = requests.post(url, files=files) 

I'm not able to post data

like image 255
micheal Avatar asked Mar 17 '15 16:03

micheal


People also ask

How do I add a photo to a POST request?

Option 1: Direct File Upload , From this method you can select form-data and set the type to file. Then select an image file by clicking on the button shown in the value column. The content type is automatically detect by postman but if you want you can set it with a relevant MIME type.

How do I send a picture in a POST request in flask?

Send the image with requests. post(url, files={'image': open('image. jpg', 'rb')}) , see https://requests.readthedocs.io/en/master/user/quickstart/#post-a-multipart-encoded-file. Receive the image with file = request.


2 Answers

From wechat api doc:

curl -F [email protected] "http://file.api.wechat.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE" 

Translate the command above to python:

import requests url = 'http://file.api.wechat.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE' files = {'media': open('test.jpg', 'rb')} requests.post(url, files=files) 

Doc: https://docs.python-requests.org/en/master/user/quickstart/#post-a-multipart-encoded-file

like image 184
kev Avatar answered Sep 16 '22 19:09

kev


In case if you were to pass the image as part of JSON along with other attributes, you can use the below snippet.
client.py

import base64 import json                      import requests  api = 'http://localhost:8080/test' image_file = 'sample_image.png'  with open(image_file, "rb") as f:     im_bytes = f.read()         im_b64 = base64.b64encode(im_bytes).decode("utf8")  headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}    payload = json.dumps({"image": im_b64, "other_key": "value"}) response = requests.post(api, data=payload, headers=headers) try:     data = response.json()          print(data)                 except requests.exceptions.RequestException:     print(response.text) 

server.py

import io import json                     import base64                   import logging              import numpy as np from PIL import Image  from flask import Flask, request, jsonify, abort  app = Flask(__name__)           app.logger.setLevel(logging.DEBUG)       @app.route("/test", methods=['POST']) def test_method():              # print(request.json)           if not request.json or 'image' not in request.json:          abort(400)                   # get the base64 encoded string     im_b64 = request.json['image']      # convert it into bytes       img_bytes = base64.b64decode(im_b64.encode('utf-8'))      # convert bytes data to PIL Image object     img = Image.open(io.BytesIO(img_bytes))      # PIL image object to numpy array     img_arr = np.asarray(img)           print('img shape', img_arr.shape)      # process your img_arr here              # access other keys of json     # print(request.json['other_key'])      result_dict = {'output': 'output_key'}     return result_dict       def run_server_api():     app.run(host='0.0.0.0', port=8080)       if __name__ == "__main__":          run_server_api() 
like image 44
Rachit Tayal Avatar answered Sep 16 '22 19:09

Rachit Tayal