将日志文件转换为 base64 并使用 Curl 将其上传到 Github

Convert log files to base64 and upload it using Curl to Github

我正在尝试使用 API.

将文件上传到 Github

以下代码有效,但仅适用于较小的内容,大约小于 1MB。

tar -czvf logs.tar.gz a.log b.log
base64_logs=$(base64 logs.tar.gz | tr -d \n)

content_response=$(curl \
  -X PUT \
  -u :"$GIT_TOKEN" \
  -H "Accept: application/vnd.github.v3+json" \
  "$content_url" \
  -d '{"message": "Log files", "content": "'"$base64_logs"'"}')

对于有点大的内容,我得到以下错误:

/usr/bin/curl: Argument list too long

现在SO上已经有关于这个错误信息的提问了,说是直接上传文件。看这里:

当我尝试此操作时,我收到一条 problem parsing JSON 错误消息。

tar -czvf logs.tar.gz a.log b.log
base64_logs=$( base64 logs.tar.gz | tr -d \ ) > base64_logs.txt

content_response=$(curl \
  -X PUT \
  -u :"$GIT_TOKEN" \
  -H "Accept: application/vnd.github.v3+json" \
  "$content_url" \
  -d '{"message": "Log files", "content": @base64_logs.txt}')

谁能指出我哪里出错了?谢谢!

使用 base64 命令而不是 jq 中的 @base64 过滤器,因为后者只能编码文本数据而不是来自 .gz 存档的二进制数据.

将 base64 流通过管道传输到 jq 以将其格式化为 JSON 数据流。

Curl 将读取 JSON 数据流并发送。

# use base64 to encode binary data and -w0 all in one-line stream
base64 --wrap=0 logs.tar.gz |

# JSON format from raw input
jq \
  --raw-input \
  --compact-output \
  '{"message": "Log files", "content": . }' |

# Pipe JSON to curl
curl \
  --request PUT \
  --user ":$GIT_TOKEN" \
  --header "Accept: application/vnd.github.v3+json" \
  --header 'Content-Type: application/json' \
  --data-binary @- \
  --url "$content_url"