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

使用Curl上传文件时获取HTTP状态码并记录Curl输出的实现方案

合并Curl文件上传、日志记录与HTTP状态码获取

我来帮你把这两个需求合并成一次Curl调用,既完成文件上传、把所有输出追加到日志,又能把HTTP状态码存到变量里供后续逻辑使用。下面给你两种可行的方案,你可以根据场景选择:

方案一:直观易维护(适合大多数场景)

这个方法把所有输出先捕获到变量,再写入日志,同时提取状态码,逻辑清晰,容易调试:

# 先把常用路径和URL定义成变量,后续改起来方便
LOCAL_FILE="/home/user/mydir/filename"
UPLOAD_URL="<my url>/.../filename"
LOG_FILE="/home/user/mydir/script.log"

# 执行Curl上传,捕获所有输出(包括响应内容和错误信息),同时追加状态码到输出末尾
full_upload_output=$(curl -w '%{http_code}' -T "$LOCAL_FILE" "$UPLOAD_URL" 2>&1)

# 把完整输出追加到日志文件,确保所有操作痕迹都被记录
echo "$full_upload_output" >> "$LOG_FILE"

# 从输出末尾提取最后3位,就是我们要的HTTP状态码
CODE=${full_upload_output: -3}

# 接下来就可以用$CODE做后续逻辑了,比如判断上传是否成功
if [ "$CODE" -eq 200 ] || [ "$CODE" -eq 201 ]; then
    echo "文件上传成功!状态码:$CODE"
else
    echo "文件上传失败,状态码:$CODE"
    # 这里可以加失败后的处理逻辑,比如重试、告警等
fi

关键部分解释:

  • -w '%{http_code}':让Curl在所有输出的最后加上HTTP状态码,这是我们提取状态码的关键。
  • 2>&1:把Curl的错误输出(stderr)重定向到标准输出(stdout),这样所有内容都会被统一捕获到变量里。
  • ${full_upload_output: -3}:这是Bash的字符串截取语法,意思是取变量最后3个字符,正好对应HTTP状态码的3位数字。

方案二:低内存占用(适合大响应场景)

如果你的上传响应内容特别大,不想把整个输出存到变量里,可以用管道的方式直接分流:

# 同样先定义变量
LOCAL_FILE="/home/user/mydir/filename"
UPLOAD_URL="<my url>/.../filename"
LOG_FILE="/home/user/mydir/script.log"

# 一次Curl调用完成所有操作:错误信息直接写入日志,响应内容+状态码通过管道写入日志,同时提取状态码到变量
CODE=$(curl -w '%{http_code}' -T "$LOCAL_FILE" "$UPLOAD_URL" 2>> "$LOG_FILE" | tee -a "$LOG_FILE" | tail -c 3)

# 后续逻辑和方案一一样
if [ "$CODE" -eq 200 ]; then
    echo "上传成功"
fi

关键部分解释:

  • 2>> "$LOG_FILE":直接把Curl的错误信息追加到日志,不用经过管道。
  • tee -a "$LOG_FILE":把Curl的标准输出(响应内容+状态码)追加到日志,同时把内容继续传给下一个管道。
  • tail -c 3:截取管道内容的最后3个字节,也就是HTTP状态码,存入CODE变量。

这两种方案都能满足你的需求,方案一更直观,方案二更省内存,你可以根据自己的脚本场景选择。

内容的提问来源于stack exchange,提问作者ekter15

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 10:42:45