2

I'm trying to upload a local image to the Medium /images endpoint (documented here).

Their example request looks like:

Host: api.medium.com
Authorization: Bearer 181d415f34379af07b2c11d144dfbe35d
Content-Type: multipart/form-data; boundary=FormBoundaryXYZ
Accept: application/json
Accept-Charset: utf-8

--FormBoundaryXYZ
Content-Disposition: form-data; name="image"; filename="filename.png"
Content-Type: image/png

IMAGE_DATA
--FormBoundaryXYZ--

The type of image data is never specified, but I'm assuming it's raw binary based on this very similar API call from Ancestry for uploading images.

Currently, I have:

headers['Content-Type'] = 'multipart/form-data; boundary=FormBoundaryXYZ'
imageData = '''--FormBoundaryXYZ
Content-Disposition: form-data; name="image"; filename="filename.jpg"
Content-Type: image/jpeg

0000000000000011111111111111111111111111
0000000000000011111111111111111111111111
0000000000000011111111111111111111111111
0000000000000000011111111111111111111111
0000000000000000000111111111111111111111
0000000000000000000000000000000000000000
0000000000000000000000000000000000000000
0000000000000000000000000000000000000000
0000000000000000000001000000000000000000
0000000000000000000100000000000000000000
0000000000000000010000000000000000000000
0000000000000000000000000000000000000000
0000000010000000000000000000000000000000
0000000000001100000000000000000000000000
0000000000000100000001000000000000000000
0000000000000000000001000000000000000010
0000000000000000001001111111110000000001
0000000000000000000000100110000000000000
0000000000000000000000000001110000000000
0000000000000000011110001111111101100000
0000000000000000111111111111111111111111
0000000001000001111111111111111111111111
0000000000000011111111111111111111111111
0000000100001011111111111111111111111111
0000001100000001111111111111111111111111
0000110000000000000000000000000000000000
0001000000000000000000000000000000000000
--FormBoundaryXYZ--'''

def post_image(imgData):
    req = r.post(base_url+'/images', headers=headers, data=imgData)
    res = req.json()
    return res

print(json.dumps(post_image(imageData), indent=2))

When executed, I get the error response:

{
  "errors": [
    {
      "message": "Expected CR Received 10",
      "code": -1
    }
  ]
}

The documentation mentions

All lines in the body must be terminated with \r\n.

and I know that the "10" in the response must be the "\n", so I'm missing the "\r". I've tried explicitly adding "\r\n" to the end of each line termination, but then I get an error like

{
  "errors": [
    {
      "message": "Expected alphabetic character, received 10",
      "code": -1
    }
  ]
}

Or

{
  "errors": [
    {
      "message": "stream ended unexpectedly",
      "code": -1
    }
  ]
}

depending on where I place the /r/n or remove it.

My question is: Is there a way to format this that I'm missing or overthinking? I'm hoping I'm just inexperienced in multipart/form-data encoding and I could be doing this programmatically instead.

Thanks! I'd be happy to add details if needed!

(As a side note: I got the image's binary data with the dcode.fr/binary-image tool.)

ladygremlin
  • 452
  • 3
  • 14

0 Answers0