You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Curl命令中正确调用Slack的files.getUploadURLExternal接口?

问题

之前用curl调用Slack的files.upload接口可正常工作,但该接口即将停用。尝试改用files.getUploadURLExternal接口时,两种curl写法均失败,分别返回参数缺失和参数名称无效的错误,请问如何正确传递参数?另外字符集为utf8,该如何指定?

原files.upload命令:

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

尝试的第一种命令:

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 .

错误信息:

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

尝试的第二种命令:

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 .

错误信息:

{
  "ok": false,
  "error": "invalid_arg_name"
}
正确调用方式说明

问题分析

  1. 第一种命令错误:files.getUploadURLExternal不支持application/json格式传参,你同时指定了该Content-Type又用-F(multipart格式),格式冲突导致接口无法识别参数,因此报缺失字段。
  2. 第二种命令错误:filename参数只需传递文件名(如img.png),不需要用@指向本地文件路径——@会让curl把文件内容作为参数值传递,不符合接口要求,因此报参数名称无效。

正确的curl命令

方式1:application/x-www-form-urlencoded格式

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

方式2:multipart/form-data格式

curl -X POST \
    -H "Authorization: Bearer xxx" \
    -H "Content-Type: multipart/form-data; charset=utf-8" \
    -F "filename=img.png" \
    -F "length=$(wc -c < /tmp/img.png)" \
    https://slack.com/api/files.getUploadURLExternal | jq .

字符集指定

在Content-Type请求头中添加; charset=utf-8即可,上述两种方式已包含该设置,可解决missing_charset警告。

补充说明

files.getUploadURLExternal仅用于获取上传地址和文件ID,完整上传流程需三步:

  1. 调用该接口获取upload_url和file_id
  2. 向upload_url发送PUT请求上传文件内容
  3. 调用files.completeUploadExternal传入file_id及其他参数(如channels)完成上传

内容的提问来源于stack exchange,提问作者Mévatlavé Kraspek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 05:35:17