how to upload image using kivy UrlRequest code example

Example: how to upload image using kivy UrlRequest

//library that can determine filetypes from binary data
import imghdr
from urllib.parse import urlencode

import kivy.properties as kp
from kivy.event import EventDispatcher
from kivy.network.urlrequest import UrlRequest

/constructs multi-part/form data from a file (needed to POST to a server via http)
from requests_toolbelt import MultipartEncoder

SLACK_IMAGE_URL = 'https://slack.com/api/files.upload'

class SlackClient(EventDispatcher):

    slack_token = kp.ConfigParserProperty(
        "",
        "Slack",
        "slack_api_token",
        "app"
    )

    default_channel = kp.ConfigParserProperty(
        "",
        "Slack",
        "slack_default_channel",
        "app"
    )

    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def image_test(self, *args):

        with open('my_image', 'rb') as f:
            my_image = f.read()

        //returns 'png' or 'jpg'
        image_type = imghdr.what(None, h=my_image)

        mime_type = f"image/{image_type}"

        //constructs the POST PAYLOAD
        payload = MultipartEncoder(
            fields={
                'file': (
                    'my_image.png', 
                    my_image,
                    mime_type
                )
            }
        )

        headers = {
            'Authorization': f"Bearer {self.slack_token}",
            'Content-Type': payload.content_type
        }

        querystring = {"channels":"my_slack_channel"}
        slack_query = urlencode(querystring)

        url = f"{SLACK_IMAGE_URL}?{slack_query}"

        //req_body parameter makes this a POST instead of a GET
        UrlRequest(
            url, 
            on_success = self.got_success, 
            on_redirect = self.got_redirect,
            on_failure = self.got_fail,
            on_error = self.got_error,
            req_headers = headers,
            req_body=payload,
            verify = False
        )

Tags:

Misc Example