Upload Image using POST form data in Python-requests

前端 未结 7 1739
醉话见心
醉话见心 2020-11-27 04:16

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

相关标签:
7条回答
  • 2020-11-27 04:17

    For Rest API to upload images from host to host:

    import urllib2
    import requests
    
    api_host = 'https://host.url.com/upload/'
    headers = {'Content-Type' : 'image/jpeg'}
    image_url = 'http://image.url.com/sample.jpeg'
    
    img_file = urllib2.urlopen(image_url)
    
    response = requests.post(api_host, data=img_file.read(), headers=headers, verify=False)
    

    You can use option verify set to False to omit SSL verification for HTTPS requests.

    0 讨论(0)
  • 2020-11-27 04:30
    import requests
    
    image_file_descriptor = open('test.jpg', 'rb')
    # Requests makes it simple to upload Multipart-encoded files 
    files = {'media': image_file_descriptor}
    url = '...'
    requests.post(url, files=files)
    image_file_descriptor.close()
    

    Don't forget to close the descriptor, it prevents bugs: Is explicitly closing files important?

    0 讨论(0)
  • 2020-11-27 04:31

    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()
    
    0 讨论(0)
  • 2020-11-27 04:32

    I confronted similar issue when I wanted to post image file to a rest API from Python (Not wechat API though). The solution for me was to use 'data' parameter to post the file in binary data instead of 'files'. Requests API reference

    data = open('your_image.png','rb').read()
    r = requests.post(your_url,data=data)
    

    Hope this works for your case.

    0 讨论(0)
  • 2020-11-27 04:34

    Use this snippet

    import os
    import requests
    url = 'http://host:port/endpoint'
    with open(path_img, 'rb') as img:
      name_img= os.path.basename(path_img)
      files= {'image': (name_img,img,'multipart/form-data',{'Expires': '0'}) }
      with requests.Session() as s:
        r = s.post(url,files=files)
        print(r.status_code)
    
    0 讨论(0)
  • 2020-11-27 04:34

    client.py

    files = {
        'file': (
            os.path.basename('path/to/file'), 
            open('path/to/file', 'rb'), 
            'application/octet-stream'
        )
    }
    requests.post(url, files=files)
    

    server.py

    @app.route('/', methods=['POST'])
    def index():
    
        picture = request.files.get('file')
        picture.save('path/to/save')
    
        return 'ok', 200
    
    0 讨论(0)
提交回复
热议问题