[SOLVED] How to upload an image using POST API

I’ve got a little app running on my desktop connecting to a test API endpoint using POST.

So far I’ve gotten text from the desktop to show up in Bubble’s database using a format like this:
first=some thing&second=another thing

I’ve also gotten an image into Bubble’s database using a format like this:
first=some thing&second=another thing&third=http://some.place.com/with/an/image.jpg

What I haven’t been able to do is get an image from the desktop into Bubble’s database.

I tried following this little blurb from the reference in two ways and it’s doing everything except uploading the image.
first=some thing&second=another thing&third={"private":false,"filename":"some_filename.jpg","content":"a string of base64 encoded image data"}

first=some thing&second=another thing&private=false&filename=filename.jpg&content=base 64 encoded image data

I wouldn’t really expect that second one to work, but figured I’d give it a try.
Bubble is returning the message I told it to in the API workflow and NOT returning any errors. The two parameters with text in them always show up in the database.

3 Likes

Can you share what you do in Curl, for instance? seeing the full request would make it easier to help.

Hi, @blueback09. This sounds a bit like a problem I had some time ago, albeit I was trying to upload pdf files through the API rather than images. For me I kept getting the string value of the URL for the file, rather than Bubble uploading the file into the Bubble database. You can see the issue here. For that issue, @emmanuel said that Bubble wasn’t able to provide the functionality even though the API provided the file as a potential field for receiving data via the API.

If your issue is in some manner related to the one I had, I’d like to know if this is in fact possible as I’d really appreciate being able to import files through an API call.

I’m not familiar with how to debug web traffic. I know that Curl is a library, but I’ve never used it.

I’ve been trying to use Fiddler to see what the actual request/response is, but nothing is jumping out as obviously what I should be looking at.

Is there anything in Bubble for checking the API traffic to see if it’s got problems?

Well whatever the tool you’re using is (maybe Postman?) can you show what you’re actually doing? Your first post only shows some pieces of it.

Sure, this is an IDE called Livecode. This is what I built my desktop app in and I’m trying to connect it to my Bubble app.


start using stack “easyJSON”
put “C:\Users\theyogi\Pictures\NK_Exoskeleton_B.jpg” into tFile
put URL (“binfile:” & “C:\Users\theyogi\Pictures\NK_Exoskeleton_B.jpg”) into tImage
put base64encode(tImage) into tImage64
replace numToChar(10) with empty in tImage64
set itemDelimiter to ""
put item -1 of tFile into tFilename
put tFilename into tArray[“filename”]
put “false” into tArray[“private”]
put tImage64 into tArray[“content”]
put jsonfromarray(tArray) into tMaybe
put “uno=uno&dos=dos&tres=” & tMaybe into tBody
post tBody to URL “https://howstr.bubbleapps.io/version-test/api/1.0/wf/api_test
put the result into tResult

You can see in the “it” variable that Bubble sent back a response, formatted the way I told it to. You can also see since the “tResult” variable is empty there weren’t any errors.

Here’s the database where it’s happily accepting the two text parameters but not grabbing the image. The things with images in them are where I put a URL to an online image into the POST or manually uploaded an image through the database’s editor.

and here’s my api workflow



Can you try just running that call with Postman, it’s easier and cleaner (or curl from the mac terminal), and then migrate it to your IDE. I’m not familiar with it, and with the screenshot I really can’t see what you’re sending.

When poking around I rand into the “:saved to s3” expression and realized it could be added after the parameter with the image array. So I tried that.


and something different happened; I got an error! Now the API responds with this when I try to post the image array per the reference (the text parameters still work)

{“message”:“Unexpected server error, please try again later”,“code”:“1482300718071x1311”}
{“message”:“Unexpected server error, please try again later”,“code”:“1482300942720x363”}
{“message”:“Unexpected server error, please try again later”,“code”:“1482300981403x354”}
etc

I also downloaded Postman and I’m learning how to use it.

What body type is Bubble expecting? Form data, urlencoded, etc? Or does it not matter?

Saved as s3 is not what you need here. The reference will explain what it does.

A form data is usually a good way to do this.

The reference doesn’t explain how to make any of this work.

So I tried something else and now I’ve got something that at least shows up as a broken image

When I right+click and “open image in new tab” it seems like I get a URL with the entire base64 encoded text of the image in it. It goes on like that for a while.

I got that by sending the post as formdata instead of urlencode and by converting the base64 into JSON-specific base64, because apparently that’s a thing.

Can you post an example of a properly formatted HTTP POST that actually succeeds in uploading an image using Bubble’s API workflow? I assume someone must have done it, otherwise the reference wouldn’t say it’s possible. That would give me something to compare to.

I think I’ve got the same POST built in Postman. The result is an error. Since this is an app you seem familiar with, can you point out where I’m going wrong?

The exact same Postman post WITHOUT the file works just fine

1 Like

This one I tried copying the raw body Postman generates from the formdata dropdown builder and pasting it into the raw option. I manually added parameters like “filename” but I’m not sure how to add the actual file data. In this one the API workflow did create a new thing, but it didn’t put any information into it, even though the text parameters are clearly still there like before.

I tried the “binary” body option but that just gives me a “could not get a response” message.

Here is a Curl request that worked on another app.

Here you are, with a workflow called upload_image that creates a thing whose field is going to be the content of file.

curl -X POST https://yourappname.bubbleapps.io/api/1.0/wf/upload_image -H “Content-Type: application/json” -d ‘{“file”:{“filename”:“image.png”, “contents”:“iVBORw0KGgoAAAANSUhEUgAAAusAAADqCAYAAAAbOguxAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAJZhJREFUeNrs3e1120a7heGdrPx/cSoQXIHhCkxXYNopwFQFlioQVYGkCkQX4JiuwHAFRiowUsGLU8E5PziIYZqSCGKAeWZwX2tpOU4ikhg8mNkz+OBvbz/WikQmaSnptaRCUr7332tJlaTPkraSGgHAz/K9fiTb++/VXj+C+SlcjbyUtDjw30tXI1+pkdladPqQx2rkg/sT+MXHt2dH/7+/RRDWc0lXklY9f28j6dqFeAAMrlcPDKwPaSTdSbpl8j+bGrlxAexYtRtnNjTfLKxcP5JTI5gyrP9ufFsuJH07Iai3B9V3SWtKApitzAWwLz2Devu7V64PWtCUSdfIF/dT9PzdXNK9q5GCpkxW4fbxfc+g3q2RLyf8LmA+rN+7QTYb+DpXkj55eB0AccndAHnh6XVWNGmSIey7h8lYQY0ka3niRG7fgkkdUgvr9547vfZgI7AD8wnqvgfGe3GmLrWg7nNcyEYYuxDWSn4X+zJPwR+E9eSCerdjvmGXA8nLNN7ZtFPun4HNydxYCzj34rKpVCZzY2QGAjuiD+vLkQfClYafEgdg29XIA+GNuPY0dvca90zr2K+PeCf87evf08yIMaxnmmbl+4pOFEjWYoIJOQNt3FYaf+U7d2MN4nQxwYS8EIuHiDCsrzTNalXGAQIka6qAtBCnsamRpwNfRnNHJ5P0fqL3ek9zI7awPmXRvmPXA8nJNe21wgy08Vlq2kuYVjR5lDUy1SQrp0YQU1gvJu5Ac7EqBqQ4yKb8fhju9cTvx8JQfN4lXpMgrJ9sMYOBHUBag17GpD86U481hbgUhhqxl39AWD/JWYD3fM7uB5KSB3hPwjo1Qo2kI8S+ypjQIZawHuoAAUAQi+09QWhGWrmA2kQUYR0AAIIYABDWAQBIfpIAgLAOAAAAgLAOAAAAENYBAAAAENYBAAAAENYBAAAAwjoAAAAAwjoAAABAWAcAAABAWAcAAABAWAcAAAAI6wAAAAAI6wAAAABhHQAAAABhHQAAACCsAwAAACCsAwAAACCsAwAAAIR1AAAAAIR1AAAAgLAOAAAAgLAOAAAAgLAOAAAAENYBAAAAENYBAAAAwjoAAAAAwjoAAABAWAcAAABAWAcAAABAWAcAAAAI6wAAAAAI6wAAAABhHQAAAABhHQAAAABhHQAAACCsAwAAACCsAwAAAIR1AAAAAIR1AAAAAIR1AAAAgLAOAAAAgLAOAAAAENYBAAAAENYBAAAAwjoAAAAAwjoAAAAAwjoAAAAQoT9oglHlez+S9FxS9sTvfXV/NpKqzp84rs0Xrp2LA+1aS9q6NsU4MklLty9e7v23StLfkkq3L/C0wrXpovPvXj7xO41rZ7l27v4gPYu9P/9zoP+jRpBaVqok/a/753LvT8I6Huwsi05ILAa+1iH1XtipCJ3/Wkl6/0S7t+167wL7XaoHdsBj4L0L6sfUduX2wYam+3eSU+xNNvMBr7d8ZIDb70cQT420Y83LvXDjs0bKTo1U1Ag8Lz60fVz+SN7pm5Wu9rJSrd0CXeXqOeqsRFgfXnCvBxbbKbPPZacw20L8PNPguXDhu++AtXQ/paRzsZo0tC7vTzgOCvd7790+qGZav687AWyqvmv/vbZuYCO827N0wXzKGlnsHc+Nq42vrlboL9FnfOjWcDZhVlrsLVJ0a5iwnnhAf6cfp/itfKZC0oXrULcuuG9nsD/We7PpUwelby4sbinx3laSbgZ2wIXbB5eSbmcSvl67PzNDn2np/rl2x8IHgnsQ2V6NWPpMS3e8V64+CO4gK02AG0yP66QuJH13geLCUPEd+qwrSZ8k/dd1qnmi++XeQ1Dvttsn13boF9TvPQbOG/d6qQ5eN+64bGstM/pZc9fPfXP93oXhz5qShav/7+7PZQT13I6LK2qErNTpN2LLSvea7qwVYX2Ezug+4tDbnWR8SSyIrkfaHusDpCXLkYL1ytVtShOaL53BK7ZAk3cmGeYHtIhrpNtPx1Yjxd4kI2eXzkre2f83EfYRbXD/1pl4EtYjsOgMrquEtqk9mFYJbMvViK/PYHN85zyWG013H8jYAew+gW3pbtM31z8uOAwGB4R1ZxKUJ7JNK0L77LLSd6VzZqXYy0pmtomw/mvhpTwQ5QmE9rEvk8hcWMTj+yCLfD9PEdJTDStz6CvHtHY1cqV0Lx0htKerICsR1kPtlE8zG3jaQvwW2TZfTNTxLwkhjwa1xUQ1uoqsXeYWTtrQTiDrF2BTDukPbfONuKad3BCfrBPal4T1cNYWdoKBGfKnSAbb9xO+1zv65uD74CqC9jjrTPbnGlhXbgBfc3gc9JxJzb/3T11QDtHuv5QuDT5lohK0n59zWF9EEgamsNSPG+AsTyymPEhWlMXBVYYpJ7a57N+stBI3Jbe1caV5rbr16V9pkx+XGM55Yhubwh3TnBn5kRuDLExwGQwOdaQWD8ploAMTYduDfRDf4P5FrLLj6cBzQVOYtnb7qaApfslK7cLEZJNOwjoOdaQWLw16SVA0EcTmsN8x3OSDGaILPJYXh+Ysd8cuVx48PR5OdmkQYR0PdaSfxFNR/kMp/OR5oFpE3IPZkqbAAxbaLQ4VNIUJS7Ga3nd8utcET0gjrOMxF7Kz8rEIFDZAcMbwif+apsAjNTLnmxetWLtjlX6+v5VGvheDsI5jQvIXgiuAAa40zfP5Ea92hRJh2p7LXoYpNOJZCcI6ji1CAjuAIVbiGmU8XSNM6qaTibMavtvzi0a49I+wjr5FSGAHMHTiTxgDkzrG9FTb9ZPvCRBhHczCARDYQY0Q1OHPvc+sRFjHqUW4pBkAEMZAjRDUMW5gJ6xjSBFysAMgjGHsGgFBfdaBnbAODnoABHZYrhGeEuMHY3a4wD6o3QnrGBrYeS4rgKFh7IZmwCNW1Ej4wIhwEyXCOobKxWlKAIQxjOtCPNyAtotXpgGPJSWsw4dCnKYEMDxQLGkGPILV4f4WTITjz0qEdfiyYuYOwEMYy2kGPIJLL4+Xu/aCHUtJa8I6QroRqx4ATpcRLnBEAOVM7vGTXyY29lxpd8aDsI5gAy2dKIAhCp2w8oRZWWp32RQetu4bCDHtROrPv/45eiJFWAcDLQBreq88YZY1ktMMD47DVzSDaXmfffQH7RVMI6nq/D2lgelK0nZv+wD4VT4yCKQQYm4kvWA3UyMPyLQ7k/uK3fyLVM5w1+7nkBQy08Wff/3z+ePbs5KwbqOzrCT97YruqZ2SuVlxIem5K8gYO9UbOlHA28R+6/qQyv00R/xeG8gWkl5GOLgV2p2lW1MCR4WaUtLXI8eZbhvn7s8Ya2Sh3SUxW0rgRwBUnPeOtfVbPhHSD9VAzHnpXtKzp/6n395+rC182C9KZ2W5HVg/u6JrPLxm7jqkd5EdhOeSNp5e6/8CdR5MOMIep332wf8l1Na160c+yO8ZqqWk1+7PLJL+9EWPgfupQf1LYjVy5+rE10Ce7dVILO3wwtNYG6pGXvWYYD21/75HdGy3WcnnZKtw+/F9RMH9+uPbs0cXJbhm3W+Hce5mSOeu+BqPr33rOqRnkq49vvaYbsSd6MApk5Nnki7l/1Ky7V4/VRtvj0xce7tv0xkLbj3vw8a9/htJ/+PGGus1koubTWMacw9lJZ8qd1w8c33pJoL99v6pm00J634Kox1cNxOE6Fq708IxhPaMThQ4OqS3g0s5wfu1oSyG0L4SN5tqb39VE9XIuvOelseamFZRx5y0rCIJ6ZuJ6qnce0/LWemGsD5eR3au3QrHqYPrSrtTbv/V7hT+/2l3CuuL6ySLIzvSW+OdaEa5AI9O9l8FDMxtCLw0HMjmvLpeunHm3ECNXBsOO3M/A2N1+xtXNyEDc+0hr42+KPHnX//khHW/bgcWXibpm3Y3Fiz2wmzu/t2V+3++u1CeP3IgXLoirIx2oheUDPCLa2ODx63hwWyh+a2ut337KyN9e+PGIqtjzUrzXV3PZXNVvZ1oro18nsodT1YXJq4I6/46qzcDd3Sm3cp50eMgvHKh/bGv4q7cQXFrsN1YXQd+qI0NYPufrR3MohnIEmS5P7f82ea6um5xu9uJZm3ws90amgT/NOF8aHWdsN6/g9p6mP0XA373ux6/ieRS9q4vzMTqOiD9WGmqjH/OW/l7woYvC8X5SLq+NoZDjvWxZqn5LQzlsrWq3rj6vTXebpX7nFtjn+uKsD5sgPXVeb728BoXLrQvn+jsLXWi7ygjzJzF4/KYwczSxOJ94jVyK/s3c1qu6UzzWxiydEy0Qb2MpO0a7a6W2FiacB56MgxhffrOaOGxU/qk3aUx2SMDrZVO1NrsH5i6HzmP8HNbC+wrpbtyei6blx8dWyNWxpo5LQxlhsbVSrt7+apIj72N5X1KWI9/gF1pdw18TicK0I+MoJGtyzJSnPRfKo7nQccQ2HPF84VOQy2NTF4bxXXW0Hpgf09Y79f5jLHKUY7wmoV2T44pjHeiC/EsXMxLGXlQ7w7Gb4z0I6lN+jeyf31vn8AuamRW25lCULcW2PM///qnIKw/rR6x+D6P9Jkz7VbYlxNOPE5dCQDmMuF/w/Z4VyidG01Tmcx1a8TC9iyV/o2muWw8znSqL+mayqWR7XlHWH/amCtImxFfO9PuOvbVA+97y0oAMIlGcd0o2CdcWvhinHeJ1MibBGt/Ixurk8vE+xgL23cte09T8XVcNpb2L2H9cPFVIxfC2KeMbnR45cnCjLEQl8KAfiRma4V/2kMKQczKZUVjuFT4exxeK22hJ6yVbH5XhA+1wp8h+ulSGMJ6mOKrNO7jjTI9/MVLVk5RAqkqlcY1yI8JfdYgj3zSv1E8j7c7RWNgrEl5nMkV/lKwc6Vtq/BnDd4R1h9eDZhyYvBKuy8eudRuJa7twCtPgf3QYx0rA0HiJaUG+pGo1ZLuCGMnB9k51Eip8JfDpBrYF4HfP+Uzh/t9eWNhPxPWf2iD8tTa8Lx2M9U2wP/m/nnIQVG4wH7oQAtZgEvKDQn3I9VMtvVWYS91iHXSf6d0L3+xNtakujAUcrsapX/msFUr7KJE8edf/+SS9Adj60+dijWl+1m74P1e/Z8xvHQ/272D7U4PfK3thDPGkrID/Ui0Gre99wH7kBgH//WMaqQOPNYsEm3XkNvle7JpfR9Vgd+/kFQT1nc2svOFH48VzLmkD3r4BtKH3Ltg3D3Abl34zwjrwGz6kTG2+Uphrh/PXD9YRdRedzM9LkKF9cLVSZNQe+YKd79Go+Gr6rl2C4jvlM4jWMf0UtKWy2Di60BL7S6T6bOCl7mAv3/QbQJux3PKDom5nul2fwj43ouI2il0nxtKHXi7UwuEIbdnyKp6pt3C4Xf1X3Ccs0LimnVptypTRfi51+p3N/bqwGz8LnQBAokoNb9V9VbIIHYWUTttNZ9r1WVorFkk1pZFhMf60oX0FUPFafVLWI/7tOSmZ2DfPxVZB5yo5Er/G+YwHx9mvO21wj3iLKZJ/92Ma6QKOJk9S6wtX0a2D1fafVkj4/2J/vzrn4KwHv+3b/UJ7Cv9uroeMmQUlB/oR5LwOdD7LiKa0FQcI0HkibVjqO05JSusFO4G9KT2+dzDeqU0TktuenSE7w2FjJxjEAkoNd/LG7ptEEpG+zChS2BCZ33c7JsVlgR1b2a/sv45oW059hsFl3t/rxXu9CRhHSn4ShMEXTkuqBEmdAlM6CzXet+ckBHUvTqbe1gvE9qWRsd9K15+4IAP1Q5nHIOgH0lGqLCeUSMcKwlM6CzXet/9diGuUfeJy2AS257NkbPfxd7f/wlVgByDoB9Jxt8EsYMazfdJQfs4wxDnmNknI2T69XJbDDTnsN4ozetMj3nW88uBs2YAafcjTFpolzGEmrTkibRfqO3okxFWYlXdt8Wcw3qqHejmiPCQ0YEC9CO0RdIBlbZgrPGl6fH/vqa5/OPRjWna0oECMDyg+/TSeLv8Q2kErxFMNxFf0FyEdZ9Svnbuw4y3HaAfAeIPffjVf4x/vpxdRFj3qVTapyZLPXyNWaOwXw8OIF01TQCMpiCsE9ZT1gbUN5J+k/RqBoH1XL+uYjTaPd6xZpAFQFgHAPv+mME2Xku61fyulavdpGTZme1uHhlMmREDGKqgCQCAsH6sSodXl+ekUTpnECqCAGBeRhMAo46DC+OfD4T1XgXzStx5ntrEA2HlNMEvXtIE0fQNJU0VXEETDPK/ERyLDZN270or16zXBPVZhrDaeLssKA3COszXx9/G2+U5pfEvQlyc+oyFTIr9q6yEdV/Poa0J6oR1BpfZBvUQg0RBaTCZow8xf7zUNP1kPtME3n1I7Wkw5wT1ZANHTdvMMohZf455RhiL6lgJMT4sKI1/nRHWo9yOPjW8JYf53ecf355VKV0GU4rTL6d6HsF+D/UtgIT1eAJHQ9vMsh/p0+9X9CNM6Ajrox7bjaQ7dpU3l5Kd56z7KMBr9ml0YeOfnh1ACNxAGLYd+oSrv6kRJnSEVGpk4ITOsiaS/bYWT4bxUrcf355tUwrrtVhVP1WuOK5ZD3XgE0DCtkMz0v9LjaTTj/TpG0JdVsWEbvedH5iu1n3KTphwclny8LHvTfuXVML6lv0aZdCoJ6yRIZ3U3MNYyEG2zyQ81EBWiJsrQ9VI0zMQ1DM8hqwINWEpE2vHUDXcdxys5C7hwEn92quPb88aa2F96AH1lX17steR7PM64Od8R40E67D6Dg5znNBYEOoY6bvPQ076514joba/Tqwd64iO8Y1YYT81qP/Ut/2eSAHW7N+T5JF1oGWgzzrnQTZkyOgbxJqAg8KcJ3S5wl2T3bdGyoDt9HrGNbIUz+H3JdTiZHHicb7R7pHalXBM//RiP6hbC+tDDiiK4DSrgO9dRbSfs8BtFXqQzSIalEKFsULzvVzqfWTjRqh+ZKX5Xi4VcjKbWj6oIjzWK0kvtLsspiZ6/aKWdP7x7dmrj2/PDrZPKpfBIL5B9utEv5NCW4V0FdmgFHIVbY6r66EnsuVEdeUzsM9Nrnjue4lByO1Zatjiza2kZ9rdOLmZeXCvXHu8+vj27NnHt2ebx/7nP4x98ObEQsiZrZ00aGQB3z+2QbbQbuW0nFmN5JHVSBlwgrHS7hGyc+qLLgL2I82Jbf01YGh+7wbohgk/QX1g3YfomzN3zK8Hvs5WPz8YJNd8zjrVbb/18e3x3xH2h7GNKE+cgRPW+x9wN4E7m2pAkYc6qG+0O5XHIDvd5D22wflGncdtzaAfCXnGqZz49yyFnVjkCns2IdWHT5SJTThrMtzjfjf2eU49sBbsyl4uFN+qendGHkqh+ZzGvlB8q+oWamQ5o/7oKnA/8jnSYHCl+awi3hsItSn6HPC9M4Vd7COsG3DqIPuaXXm0XGFXTId2NKFXSm4CBxRqxH6N3Ct9hZvQxRrEttRI8hPXJuGwHnq7VmKRdNZhvdZpKx6F+FKSmAaJ7cDfbQKvKtzPoEZCTkiGDrKhg1iutC9zsHAMVBq2Oh56QrcwMNlJvUa2CbdvY2TCmQmzDOtDDrArdueT1gZmw5WHsB26k1oq3cthLgzUyND9Wyv849qulO7K043CPVe99cFDjTUGaqRItEY+GQhyn5W20NuXi8thZh3W7078vVXCHZ8PCyMTmjsPr2GhE75PsN4KI52vj/37wcB2fFJ6Z/xWRiaqWyOvMUSmNFcn1wYmqo3SXlmXke2z0h8Q1gOodfqq2D279MEQ9imhDmYrG48++5JQGCvc9lg4/lMIYm0Ys7DC6LNGLPSxlfzcIPqBNh0lvFlYFEo9qFuakNyL69dnGdal01dfU+v4fAWGL0YCw8ZjyN4Qxrxuh5UVPl+DTy0bA1lh6PhLYTI3ZHzYV8rG4+KWiYxblrbjg+bBynZ+Elc2zDKsbweEuhWB3WRQ992x3BnZptjDWFsjVjraO6P1NucasfT5G8+TMCv9SOzj1sLQ5681ny+v2xqZcFobRwjrkXTIbcfnY3BZR9qJFpK+Gzp4fHegljrkItKOqpD0zdDn9j3wWBnIYg7s1j73Rn4vgfP9enMM7CtjNXI9sxxnZVGiDewLovV8wrqPA27lgsiphbNwv3/Vea1YBtqFwWAwRgd6Z2j7isg6qrZGckOf6W4mNRLLpM5iv+d7fzaydX1zbGPN2tgEw9r+nMKtoc/SBvZVZG246NTyl87P2m1L8HHSclivPRx0eafRV0d2gMvO7xR7A+33CMLY2mBQbzTONeZb2fqK4rajuqBGeis1zpmSjeysnHYDu+XBLHODlrVV3s1Ix7u1ldgYxppMu+uUrT0y+c7Y8R7z+DpE239YnnTm7jP+1/XJ7cLsovNz5f6f724SHazf/u3tx9pyES7k/6amUoe/EOOl6ySPKa5r2fvSk7bwLHbwY7bXSjZPHZeSzo1NJizXyCuNd1nTWja/h2HrasRSuFi4GskNttezEY+ne6MTqFvXf1qqkaXRINa4GmkG1n+IG6mH9n+5C5TW1K6PKw19psyNBxeht+nj27Nkwrpk99ICK0WYuaKz+qVQPjrQp3w3Gi4a7VZ6bhX+W1ct10jpBqsxt/+7bK7yNJIuFX5lLNPuGfsrozWycf3tmBPZ70a3vXY1sjUw2b9xYd0iH4tCsYZ1yxPO9vi9NDDpXLkazizUW5+wbvkymNa50c+V68flMouAhfdNtr+9dYoD9NLotrcz+FCnzzL3vt+N18jYlyG0kyarNdKeZg1VI+uA72+lRmrZu5SgO9Z8CjjW5J0atRrUG9m6djvUMdIY/WztOLRWmEWTpRuHfZ4Rai+RmUQMYd1yJ9qdiX+ZqCPrDq5WT1dPve+2sv2ornaw+6/bd/kE79etkcxw25QT7bu1bF2S9Fgguphgn3Xf78p4jdxOtO8srPwdM9a0k/+x91kReCKZSlCdcry9M/z5MtfXtONSMcH7tZOEsZ4Dv9JE3/odw2UwbaNbPY196IDZaveV6aXH7V9Kem14ZeOQMa9DPjSwfIuobbo14uMgzDs1soioHca8DnnfUna+ybdPjWw9BZHC1cY7xfNEmkbjX0a3P6m7iqhtuv2Irxp5546VPJJ2qF2N+JwQxTpWZm4cjGXfVdo9erLU6d9cv7/9CzcOTjnBfKMTLlNL7Zr11sVUMxjPnWkp6e9OKDumwQv389wVXqH4bF0BT+lG9p/E8tBg09ZJdUSd5O6nWyN5hNsd4kbtWJ8DXHVqpHZ/b46okYWrkSLSGjnX9GdWv0faVm3gObZGik64afuRLMLt9rkoFHtYj3FRojsOVp281DwR4LNOvxY6K520qJBqWI95oD1UlPUDHUUKGkkvNP1lB7GtKhzblpWOf1JRTMfAC01/6jpXXM+x7tOfLJSWUuPeeGwtsFEj/W3k9762FMJ6Sllpvz/IDY/vvRefUg7rheK61GGuLhXuZp9YVxXmZspLpPZdKL6zdHMTasLfivUs3dxqxPclUqmE9VzpLUrEUI//M1ZY/z2yxqhk98kf+DH7vQ34/lvxVADrbhX2huDQ74+nXSvsDcGh3x9PeyNuKn1ITVaaXKYR7yn8PcIGYaC1PbN8Y+BzMNDannBb+MZIa19GBFsTbit9GcgBp9oo/LP55+Y1YZ0ZNfuFgTaFyZyVkFzL7nc4UCN2JpasTtqc8LNfjmPtW7RTlxPWf+3QOVhtuZatlY6KMGbOpfw8nsuXrbhkyppXsrUQcytWJ62N/SzE9G+vhqaYxIKw/rNC3CBmyUbTP4Lv2M+1YfeYCT0W98WlOJ1uxbmxyZz1zzVHb8RKcV+VWNyMXoxhPdPubu2M3UdHcORASxgLa2u8Rt4QxphYP6IRq5P05fEfX9c0A2F9Sp8I6mbUsnfamjBmbzJn/XIkwlj4IGG9RmLp61J1K86SDrWmDQnrU1kpvQf9xyqmgNO4gZbAPn1QjyXgEMaYzB1bz5h+MsdlHH6E+EbgOSkJ6ztX1ALhd+BnJowR1FP6zCnUCJMLPBbUaW//gb2iGUZRE9Z3q+o5tUBQ9/DZa3YjoZfATjsTIGnnmeJM8zi+EtZHfNg8ZhHUuyHhBR0VIYzAHkyZQPtuxH0OBPW4x/IX4pIY3226nXtYzzTi17hidiE3hUkHIXeabanZrd5DWCo1smVSN4pbgvpkuIbdn7sx+4JYwnpBHRBcRgrsdFT+QtiLxIJLShNUQti4fSM14i88cjPp9G3OYx2H54nbMd8glrC+oBYIYSMdYHRUw10r3ZUwJnX+jrNUQ1gb2Et2NcdZpNbisq4hLsduu99pYzwxwM7hdCQd1bABdk3YxAPqmYSw9li4ZZefNNl5wWQnuK04S3SKzRT9G2EdD3Wec1vl2IpLHvooZzjA3rptrtn9HFMPuGTiH/UxFepzWOlH5zj2Dw3qkyxoEtZxqPOc6+y6dgMHl8U87lrzvfmycjVySxk8qHED2FxD61bSM434ZIhEauSV7J2tqgPUbM3xG21WmuzKA8I6uh1G23nO/QBdi1X2x4LqmqChS/G0mENK8Ui4tkbeEHgeDDnPZPesXJn4+zHpHJ6V3kw90fw9osbBeK6Nd54hgymTlx/hlAnM4WDKmZgfAxgTmMOBZ0NT/HuJhfU+9UPi73fKpJPj+sdE80WICczvER3k8G/jBpI1TfHowTnnwbbd/ltK4cHBbK35rkA1brLyQqzAPdZG55rvE2O6k/0Ytn87YTAtI2mT0vVx15rn4lW7/cEmmjGFdWZ1fgvvlRtAaNfjB9s5hfZN6M4pMrV+rECVM6uRNTXSq9+dyyplO5GLcbJ/ndj7+LKeWWg3c8zGdM36lr7ea+GVNMdJgSz10N4GMCZyHGMPBbBujRDST6uRtv1SrZHryCdymwn2zSbS/d/MILSb68d/e/txtPG4kJQd+PfViTs3l/Sdfv6kA2vrDirCl1+5pPeSVg/Uekw1cucGD2rEfz/Y1kjsE9UP2q2QEtD9Wkh6l0iNXLvxJoUaySR9c/28b5ULgqm008r1c3nk27JxY2E1xZt9fHs2eVjPJS0lvXSD01M7rHGN8VX9rtn65N5nSu3q0bsA7z20M7hLqOO0buVqZBHRZ95K+ixufptyQHvn+siYauSDOLM51eR/GVnoaTo1Uia4TwpJX+R3MSaloJ7CxLNy9buZep9MGdbb2VTh4YBvZzT1E53ZN023ilm6g6o74C4lvTYa3KvOwFoLIQdcq6GsdAGdGqFGnprEMdEPGxLbBSJrwb3Zq5E5HK+fPB2rKQd1kZXshfW1C+ljhOaNHr9k40LSzUQd0lPfrLbU7mzCItCgW7vw1Z6hIHzZ7LDaGskD1shn9yfhy14QWASukarTj2zZJWYnd22NZAE+Q3ecKWe6H9aSrgbkiTvN98lrFrJS1RkHTWSlMcP60gXlKQaUWz1888K9xj/N8qbnwJW5IlxIeu7aqPBcbLXrMCvxhJxYw3vbWY1RI21N/N0JYITz+IJZ4X5eur/nI9VIqdPvIUI4RacPKUaokfJAP4Ifx+eVy0LHTJoaHXfVwNws3M9ZZ8FidllpjLCeuZC+mnhbaheaq4kD+7n8XcebdQJZn4JsB9FGPGd+DgNAvlcrxw6q3c4JaQe0bECNEMrnUyN9wnt3fKFG+ll2JtX7bdpOhpnokJUmC+u5/F2v5Ts832h3WYwvjXuvLccNgJQ6ewBAnJ56znqh3Q2dReDP+dAq+qV2K++1h/coxbfwAQAAIJKwXsj/I4uGBvaLA/9+60L2qc8RLzWvb5UDAABAJP544N9nxoJ660Y/btjoarS7y3qt4+46LvXjyQdVz89QHGiXklICAADAVGHdYlBv3evHHb6HbPXrpSwLDbv5INfTd4Bvtbvjm+AOAAAALw5dBrOW/W/Y+9RzMlEOCOo3kr7r6a+UX7pJzhfF/5W7AAAAMBjWC53+0P8p5RN8zky7m2svev7eQjZuygUAAEBiYf0mos9+MXIg/jLg9bOBvw8AAAD8FNaX8vstUlO4GfF1hwbtTP0v1wEAAAAOhvX3EX7+hfyvXufy90VLPl8LAAAAMw3rheJbVR9rknFl/PMBAABgZmE95kC5NP562QivCQAAgBmF9UXE2+AzDC80zjXmBaUGAACAU8J6ofifC/7SY/C3/PkAAAAws7C+SGA7fG1DQUkAAADAUlh/nsB2+ArZNSUBAAAAS2E9T2RbfAT2scI6kwAAAADMOqxnHl6jGumz/U2pAQAAYM5h3YdGUjnC625pWgAAAJwS1vGzDyME9ZpmBQAAAGF9uI38rq5f0qQAAAAgrPsN2I2n16lpTgAAAJwa1kua4ReVpFcDA/tG0i1NCQAAgCFhPRX1SIH9lNe9lHROeQEAAGBoWP9KWH80sL+QdK3jVtk3kp6JFXUAAAB48IfGe7b4lMoRX7uRtHY/S+2+fOnlXqD/232GmpICAACAz7BeJrAdU50d2IpnpgMAAGAiv2u3clxFvh0EaAAAACQZ1iX/XwQ0pVppXMoDAAAAHAzrm4i34Y7dCAAAgJTDehNpYI/1cwMAAABHh3Vp93jC2NzJzzeNAgAAAKbDeq24ng/eiOeZAwAAYCZhXdqtrteRfPZzsaoOAACAGYX1xoVg67bicY0AAACYWViXdl+SZPn69SqSCQUAAADgPaxL0lo2n7LSiMtfAAAAMPOwLheKLQX2RtIr8QVIAAAAIKybCuwEdQAAABDWHwjsIa9hryQ9I6gDAACAsH7YWruV7Xriz3ct6YW4Rh0AAACE9UeVLjhPscrevteaXQQAAADC+nEaF6CfaXctezNCSH8lrk8HAAAAeof1Vq3dtezP3J/bAZ+hlnTrXuuVC+wAAADA7P0x8Pcb7VbYN5IySYWkhaTn7u9yf29Dee3++av751LTXwcPAAAAROH/BwDSlTevI70CFQAAAABJRU5ErkJggg==”}}’

Thanks, I think we’re on the right track. If I copy the JSON array and paste it into Postman under raw, and select application/json from the pulldown, and tell my API workflow to expect a parameter named “file” to be placed into a file field in a thing, then I get an image uploaded to Amazon that displays properly in Bubble’s image element.

So far I haven’t been able to replicate that success from my desktop app. I keep getting a formatting error. First it was an unexpected token and now it’s a very specific message saying that the content for the image file is missing. That seems like a positive trend, since the server knows enough about what’s going on to give me a specific error message.

I think I got it.

The reference says to put the base64 string into “content” but the server is looking for “contents” with an “s”.

Oops you’re right, sorry about that. Will fix the reference.

For what it’s worth, I also found another way of doing things.

This post is fascinating. He’s doing some really cool stuff with javascript in an html element. One of the neat things I learned is that you can put the entire base64 content of an image into a “link”.

So something that did technically work for me was to upload the base64 into a thing’s text field with “data:image/jpg:base64,” concatenated onto the beginning. Then I put that text into an html element with this code "<img src="search for whatever:first item's text field" width="200px"/> It’s ugly and clunky and slow, but it’s an option.

2 Likes

Hokay, so, here’s what seems to be working for me:

  1. get your file (name and data)
  2. isolate and url encode the filename (somefile.jpg)
  3. base64 encode the filedata
  4. put the filename into array1[filename]
  5. put the filedata into array1[contents]
  6. put “false” into array1[private] (I haven’t tried making it private and attached to a database thing yet)
  7. put that array into array2[file] (I tried changing that but the server stopped accepting it, so apparently it has to be “file”)
  8. put anything else you need into array2[], for example “some example text” into array2[example]
  9. convert array to JSON (as required) what you end up with is something like this:
    array2={
    file={filename=file’s-name.jpg, private=false, contents=base64}
    example=some example text
    }
  10. setup your API to recognize the “file” parameter as a file and the “example” parameter as text
  11. change the headers to “Content-Type: application/json”
3 Likes

Since I’m looking at it, I noticed that the reference still says “content” when it should be “contents”

1 Like

You are best to file this with a bug_report so it doesn’t get lost in the forum or forgotten.

1 Like