restcurlslackslack-api

Correct use of files.getUploadURLExternal in Curl command line


I was using:

curl -v -F file=@/tmp/x.png -F "initial_comment" -F channels='xyz' -H "Authorization: Bearer oauth" https://slack.com/api/files.upload

Works still very well, but file.upload will be discontinued soon.

Now, after reading the doc, I tried:

curl \
    -H "Authorization: Bearer xxx" \
    -H "Content-Type: application/json" \
    -F "filename=/tmp/img.png" \
    -F "length=$(wc -c < /tmp/img.png)" \                                           
    https://slack.com/api/files.getUploadURLExternal | jq .

or

curl -X POST \
    -H "Authorization: Bearer xxx" \
    -H "Content-Type: application/x-www-form-urlencoded" \
    -F "filename=@/tmp/img.png" \
    -F "length=$(wc -c < /tmp/img.png)" \
    https://slack.com/api/files.getUploadURLExternal | jq .

But I get JSON error for the first one:

{
  "ok": false,
  "error": "invalid_arguments",
  "warning": "missing_charset",
  "response_metadata": {
    "messages": [
      "[ERROR] missing required field: length",
      "[ERROR] missing required field: filename"
    ],
    "warnings": [
      "missing_charset"
    ]
  }
}

and the second command:

{
  "ok": false,
  "error": "invalid_arg_name"
}

How to pass parameters correctly ? The doc have no example in Curl. My charset is utf8, same, how to pass it?


Solution

  • Ok, figured it out by trying different methods:

    length=$(wc -c < /tmp/img.png)
    curl \
        -H "Authorization: Bearer xxx" \
        -H "Content-Type: application/x-www-form-urlencoded; charset=utf-8" \
        -d "filename=test" \
        -d "length=$length" \
        https://slack.com/api/files.getUploadURLExternal | jq .