【问题标题】:Convert log files to base64 and upload it using Curl to Github将日志文件转换为 base64 并使用 Curl 上传到 Github
【发布时间】:2021-10-05 09:32:21
【问题描述】:

我正在尝试使用其 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 的问题,它说直接上传文件。见这里:curl: argument list too long

当我尝试这个时,我收到了 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}')

谁能指出我在这里犯错的地方?谢谢!

【问题讨论】:

  • jq -n '{"message": "Log files", "content": ($content | @base64)}' --rawfile content yourfilehere
  • -d $( jq -n '{"message": "Log files", "content": ($content | @base64)}' --rawfile content logs.tar.gz ) 替换行返回argument list too long 错误。
  • Curl 抱怨参数列表太长,因为生成的 JSON 长度超过了参数缓冲区长度,并且因为子外壳扩展周围没有双引号,它在空格处拆分为多个参数。基本上:jq -n '{"message": "Log files", "content": ($content | @base64)}' --rawfile content logs.tar.gz | curl --data-binary @- ...
  • 成功了,您愿意将此评论作为答案,以便我接受吗?
  • jq @base64 只能编码文本,不能像 gz 存档那样编码二进制数据。因此,不要使用 Jq 编码 base64,而是使用 base64 命令。我会回答这个问题。

标签: json bash github curl github-api


【解决方案1】:

使用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"

【讨论】:

  • 谢谢,效果很好。
猜你喜欢
  • 2020-06-28
  • 1970-01-01
  • 2020-05-20
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-02
  • 2023-04-10
相关资源
最近更新 更多