CircleCI场景下如何通过单条curl命令实现multipart/form-data批量文件上传
单curl实现多文件multipart一次性上传的可落地方案
实现逻辑
通过bash数组暂存全部curl请求参数,将固定表单字段、待匹配文件对应的multipart上传参数统一收集为变量值后,拼装成完整的请求命令单次执行,替代原有逐文件发起curl请求的逻辑。
CircleCI 流水线可直接复用的代码
cd ~/project # 初始化curl参数变量(数组形式,兼容特殊字符文件名) CURL_ARGS=( -k -H "Accept: application/json" -H "Authorization: Bearer $bearertoken" -F "deployment-name=${CIRCLE_SHA1:0:7}" -F "deployment-source=circleci" -F "enable-duplicate-filtering=false" -F "deploy-changed-only=true" ) # 收集所有匹配规则的文件,逐一生成上传参数加入变量 while IFS= read -r -d '' file; do # 完全对齐原有单文件上传的参数格式 CURL_ARGS+=( -F "${file}=@${file}" ) done < <(find . -name "*.txt*" -type f -print0) # 单条请求完成所有文件上传 curl "${CURL_ARGS[@]}" http://www.blah.com
实现细节说明
- 采用数组形式存储参数变量,而非普通字符串:避免shell自动分词导致的参数错位,即便文件名包含空格、中文、特殊符号,也能正确识别文件路径完成上传。
- 匹配文件的遍历逻辑采用
find -print0搭配read -d ''的组合写法,适配全类型的合法文件路径,不会因为路径中的特殊字符中断遍历、错配文件。 - 循环生成的参数格式完全对齐原有单文件上传的逻辑,后端接口不需要做任何适配调整,curl会自动按照multipart/form-data的规范,在同一个表单请求中拼接所有文件的二进制段。
- 相比原有逐文件发起请求的写法,该方案减少了重复TCP建连、TLS握手、请求头重复传输的开销,待上传文件数量越多,流水线任务的运行效率提升越明显。
内容的提问来源于stack exchange,提问作者dayv2005
相关产品推荐
相关产品推荐

