如何在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" }
正确调用方式说明
问题分析
- 第一种命令错误:
files.getUploadURLExternal不支持application/json格式传参,你同时指定了该Content-Type又用-F(multipart格式),格式冲突导致接口无法识别参数,因此报缺失字段。 - 第二种命令错误:
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,完整上传流程需三步:
- 调用该接口获取
upload_url和file_id - 向
upload_url发送PUT请求上传文件内容 - 调用
files.completeUploadExternal传入file_id及其他参数(如channels)完成上传
内容的提问来源于stack exchange,提问作者Mévatlavé Kraspek
相关产品推荐
相关产品推荐

