cancel
Showing results for 
Search instead for 
Did you mean: 
Reply
Highlighted
Helper III
Helper III

Post File via HTTP

I can't get this to work in flow. I get bad request. Below is the 400 status code and the header and body I'm sending. { "code": "InvalidObject", "message": "request object is invalid", "errors": [ { "code": "MissingRequiredField", "message": "The RecordId field is required.", "resource": "request", "field": "RecordId" }, { "code": "MissingRequiredField", "message": "The RecordType field is required.", "resource": "request", "field": "RecordType" }, { "code": "MissingRequiredField", "message": "The Title field is required.", "resource": "request", "field": "Title" }, { "code": "MissingRequiredField", "message": "File or Url is required.", "resource": "request", "field": "File" } ] } POST /v4_6_release/apis/3.0/system/documents HTTP/1.1 Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="recordid" 81014 ------WebKitFormBoundary7MA4YWxkTrZu0gW-- Content-Disposition: form-data; name="recordType" Opportunity ------WebKitFormBoundary7MA4YWxkTrZu0gW-- Content-Disposition: form-data; name="title" Test document ------WebKitFormBoundary7MA4YWxkTrZu0gW-- Content-Disposition: form-data; name="url" https:/********************/sites/*************s/************es/SI-160829.pdf ------WebKitFormBoundary7MA4YWxkTrZu0gW--

1 ACCEPTED SOLUTION

Accepted Solutions
Highlighted
Skilled Sharer
Skilled Sharer

Re: Post File via HTTP

@gbuhreand @SvenG  Rest assured there is a way of doing this.

 

If you want to post multipart form data with binary content via the HTTP connector you must format the body of the request in a certain way.

 

What they don't tell you (except in an obscure section of the Azure Logic Apps documentation) is that the HTTP action actually deserialises JSON input and converts it to a multipart string value.

 

Leave the Headers parameter blank. In this example the API documentation says this:

POST /api/gateway.php/sample/v1/employees/1/files/ HTTP/1.0
Host: api.bamboohr.com
Content-Type: multipart/form-data; boundary=----BambooHR-MultiPart-Mime-Boundary----
Content-Length: 520
 
------BambooHR-MultiPart-Mime-Boundary----
Content-Disposition: form-data; name="category"
 
112
------BambooHR-MultiPart-Mime-Boundary----
Content-Disposition: form-data; name="fileName"
 
readme.txt
------BambooHR-MultiPart-Mime-Boundary----
Content-Disposition: form-data; name="share"
 
yes
------BambooHR-MultiPart-Mime-Boundary----
Content-Disposition: form-data; name="file"; filename="readme.txt"
Content-Type: text/plain
 
This is a sample text file.
 
------BambooHR-MultiPart-Mime-Boundary------

But I want to post a binary file instead of "This is a sample text file", so while the plain text above works as the body of the HTTP action when the file content is only text, for binary to work I make the HTTP body like this.

{
  "$content-type": "multipart/form-data",
  "$multipart": [
    {
      "body": "18",
      "headers": {
        "Content-Disposition": "form-data; name=\"category\""
      }
    },
    {
      "body": "@{outputs('Convert_file')['headers']['x-ms-file-name']}",
      "headers": {
        "Content-Disposition": "form-data; name=\"fileName\""
      }
    },
    {
      "body": "yes",
      "headers": {
        "Content-Disposition": "form-data; name=\"share\""
      }
    },
    {
      "body": {
        "$content": "@{body('Convert_file')}",
        "$content-type": "application/pdf"
      },
      "headers": {
        "Content-Disposition": "form-data; name=\"file\"; filename=\"@{outputs('Convert_file')['headers']['x-ms-file-name']}\""
      }
    }
  ]
}

 In my example the dynamic content is all from a OneDrive PDF file conversion process, but you can adjust your Flow to suit your needs

 

image.png

View solution in original post

20 REPLIES 20
Highlighted
Super User
Super User

Re: Post File via HTTP

Could you please provide a detailed screenshot of your Flow, and any error messages it receives so that we may better assist you? Thanks.

Highlighted
Helper III
Helper III

Re: Post File via HTTP

It says request object is invalid2019-04-26_13-53-51.jpg2019-04-26_13-56-25.jpg2019-04-26_13-55-19.jpg

Highlighted
Helper III
Helper III

Re: Post File via HTTP

I have updated this request with screen shots

Highlighted
Super User
Super User

Re: Post File via HTTP


@gbuhre wrote:

I have updated this request with screen shots


Sorry. with the URLs blacked out, without expanding the steps there isn't much we can help with, as we have no idea which parameters you're parsing in and/or which fields you're trying to access. Expanding the steps and only blacking out what you absolutely must is preferred. Example:ExcelScheduleList.png

My guess is that the URI you're parsing in, is likely in the incorrect format.  A simple way to check if your formatting is correct is copying the URI path from your Flow's run error message, and pasting it into your browser. If it runs and returns the data as expected, your path is okay... my guess is that it won't.

A 400 error is almost always a path or API issue, which means that other than the path, you may be utilizing a POST request when the API is expecting a GET request, or that you may be referencing the wrong part of the API. Again, I am unsure without seeing the expanded steps. 

If this reply has answered your question or solved your issue, please mark this question as answered. Answered questions helps users in the future who may have the same issue or question quickly find a resolution via search. If you liked my response, please consider giving it a thumbs up. THANKS!

Highlighted
Helper III
Helper III

Re: Post File via HTTP

2019-04-29_15-47-57.jpg

 

Here's the Post request without the URL's balcked out.   All I'm trying to do is a send a PDF document to my CRM tool.

Highlighted
Helper III
Helper III

Re: Post File via HTTP

I got it to work but now I'm having issues view the PDF file.   I get an error when I try and open up the PDF about a decoding issue.   2019-04-29_15-48-27.jpg2019-04-29_15-49-44.jpg2019-04-29_15-47-57.jpg

 

 

Highlighted
Helper III
Helper III

Re: Post File via HTTP

I'm taking a PDF file from sharepoint and trying to save it to ConnectWise our CRM tool.   When I try and open the file from the CRM tool it says the files is damaged and could not be repaird.   I get a 201 when I submit.   Let me know if you need any other screen shots.

 

2019-05-03_12-23-52.jpg2019-05-03_12-25-28.jpg

Highlighted
Helper III
Helper III

Re: Post File via HTTP

1. If you download both the original source PDF and the Flow->HTTP created PDF, are they the same filesize?

2. Do you have access to Acrobat DC or the older Acrobat PRO? Sometimes they are more forgiving with opening different PDF file constructs. If you can get the copied file open in one of those apps, perhaps it may shed some light on why Acrobat Reader can't handle the copied file.

 

PDFs can be tricky. It could be a limitation of the CRM endpoint, too. If Flow is passing the file content succesfully and all required properties, that's what I would suspect is the case.

Highlighted
Helper III
Helper III

Re: Post File via HTTP

If I submit the file via postman it works great no issues.   I if I do the same file from Flow I can't open the file.    

Highlighted
Helper III
Helper III

Re: Post File via HTTP

It has something to do with encoding.   I need to send the pdf using To using the ISO 8859-1 encoding type of 28591?  is this possiable?

Highlighted
Helper III
Helper III

Re: Post File via HTTP

So little more testing and it's defiantly something with how flow is processing the attachment. If I send the same attachment via Postman it works great. If I take that same file and code and try using flow it says successful but can never open up the file. The two screen shots are from the same file but the encoding is difference one is from flow one is from Postman.7.jpg8.jpg

Highlighted
Skilled Sharer
Skilled Sharer

Re: Post File via HTTP

@gbuhreDid you ever solve this? I'm having the same challenge

Highlighted
Helper III
Helper III

Re: Post File via HTTP

No still an open issue

Highlighted
Helper I
Helper I

Re: Post File via HTTP

Same issue here. Trying to POST a PDF file via plain HTTP but no success. It's really weird. No one knows a solution...

Highlighted
Skilled Sharer
Skilled Sharer

Re: Post File via HTTP

@gbuhreand @SvenG  Rest assured there is a way of doing this.

 

If you want to post multipart form data with binary content via the HTTP connector you must format the body of the request in a certain way.

 

What they don't tell you (except in an obscure section of the Azure Logic Apps documentation) is that the HTTP action actually deserialises JSON input and converts it to a multipart string value.

 

Leave the Headers parameter blank. In this example the API documentation says this:

POST /api/gateway.php/sample/v1/employees/1/files/ HTTP/1.0
Host: api.bamboohr.com
Content-Type: multipart/form-data; boundary=----BambooHR-MultiPart-Mime-Boundary----
Content-Length: 520
 
------BambooHR-MultiPart-Mime-Boundary----
Content-Disposition: form-data; name="category"
 
112
------BambooHR-MultiPart-Mime-Boundary----
Content-Disposition: form-data; name="fileName"
 
readme.txt
------BambooHR-MultiPart-Mime-Boundary----
Content-Disposition: form-data; name="share"
 
yes
------BambooHR-MultiPart-Mime-Boundary----
Content-Disposition: form-data; name="file"; filename="readme.txt"
Content-Type: text/plain
 
This is a sample text file.
 
------BambooHR-MultiPart-Mime-Boundary------

But I want to post a binary file instead of "This is a sample text file", so while the plain text above works as the body of the HTTP action when the file content is only text, for binary to work I make the HTTP body like this.

{
  "$content-type": "multipart/form-data",
  "$multipart": [
    {
      "body": "18",
      "headers": {
        "Content-Disposition": "form-data; name=\"category\""
      }
    },
    {
      "body": "@{outputs('Convert_file')['headers']['x-ms-file-name']}",
      "headers": {
        "Content-Disposition": "form-data; name=\"fileName\""
      }
    },
    {
      "body": "yes",
      "headers": {
        "Content-Disposition": "form-data; name=\"share\""
      }
    },
    {
      "body": {
        "$content": "@{body('Convert_file')}",
        "$content-type": "application/pdf"
      },
      "headers": {
        "Content-Disposition": "form-data; name=\"file\"; filename=\"@{outputs('Convert_file')['headers']['x-ms-file-name']}\""
      }
    }
  ]
}

 In my example the dynamic content is all from a OneDrive PDF file conversion process, but you can adjust your Flow to suit your needs

 

image.png

View solution in original post

Highlighted
Helper III
Helper III

Re: Post File via HTTP

I will give this a try as soon as I can.   I will update everyone once I do.

 

Thanks,

Highlighted
Helper I
Helper I

Re: Post File via HTTP

I was able to get it working with the right json syntax. It's really tricky and hard to find. I also created my own API connector and can use it across my Flows.

With the help of swagger and Open API I created a custom connector to the API I use. So now it's working like a charm.

 

I only can encourage everyone to create a custom connector and use the "swagger editor" switch on top. Now it should be much easier to create the connector with the Open API spec.

Good Luck!

Sven

Highlighted
Helper I
Helper I

Re: Post File via HTTP

I will post my swagger spec as follows. I'm connecting to lexoffice API. 

 

 

swagger: '2.0'
info: {title: lexoffice API, description: 'lexoffice API https://developers.lexoffice.io/',
  version: '1.0'}
host: api.lexoffice.io
basePath: /v1/
schemes: [https]
consumes: []
produces: []
paths:
  /files:
    post:
      responses:
        default: {description: default}
      summary: Upload a file
      operationId: FileUpload
      description: https://developers.lexoffice.io/docs/#files-endpoint-upload-a-file
      consumes: [multipart/form-data]
      produces: [application/json]
      parameters:
      - {name: type, type: string, default: voucher, description: document type, required: true,
        in: formData}
      - {name: file, in: formData, required: true, type: file, x-ms-summary: File
          Content}
definitions: {}
parameters: {}
responses: {}
securityDefinitions:
  API-Schlüssel: {type: apiKey, in: header, name: Authorization}
tags: []
security:
- API-Schlüssel: []

 

Please keep in mind that MS Flow currently only support Open API v2.0 - That's a bit problematic with some authentication types. However, I even got it working with Bearer auth - the parameter value for the Auth key just must be in format "Bearer 1234" - if 1234 is your key.

 

Highlighted
Responsive Resident
Responsive Resident

Re: Post File via HTTP

Hello,

 

I'm working on the exact same thing you are doing.

 

Except I am using gis cloud custom connector. I can easily perform all other calls like read, export, delete.

 

The writing part is different because it requires this format you are working with - multi part form http post.

 

I'll be using the JSON format mentioned by @WillPage 

 

I'll update when I have solved it for gis cloud at least.

Helpful resources

Announcements
firstImage

Power Platform 2020 release wave 2 plan

Features releasing from October 2020 through March 2021

firstImage

Join the new Power Virtual Agents Community!

We are excited to announce the launch of Power Virtual Agents Community. Check it out now!

firstImage

New & Improved Power Automate Community Cookbook

We've updated and improved the layout and uploading format of the Power Automate Cookbook!

thirdimage

Power Automate Community User Group Member Badge

Fill out a quick form to claim your user group badge now!

Top Solution Authors
Users online (11,325)