xplayer-ota/upload_to_qiniu.sh
2025-08-08 18:48:46 +08:00

104 lines
3.0 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# 七牛云上传脚本
# 需要环境变量: QINIU_ACCESS_KEY, QINIU_SECRET_KEY
# 检查环境变量
if [[ -z "$QINIU_ACCESS_KEY" ]] || [[ -z "$QINIU_SECRET_KEY" ]]; then
echo "错误: 请设置环境变量 QINIU_ACCESS_KEY 和 QINIU_SECRET_KEY"
exit 1
fi
# 硬编码存储空间和域名
BUCKET="$QINIU_BUCKET"
QINIU_DOMAIN="$QINIU_DOMAIN"
# 参数检查
if [[ $# -lt 1 ]]; then
echo "使用方法: $0 <文件路径> [文件名(可选,默认使用原文件名)]"
echo "示例: $0 ./image.jpg"
echo " $0 ./image.jpg newname.jpg"
exit 1
fi
FILE_PATH="$1"
KEY="${2:-$(basename "$FILE_PATH")}"
# 检查文件是否存在
if [[ ! -f "$FILE_PATH" ]]; then
echo "错误: 文件不存在: $FILE_PATH"
exit 1
fi
# 七牛云API配置 - 华南广东区域
QINIU_UPLOAD_URL="https://up-z2.qiniup.com"
# 生成上传凭证的函数
generate_upload_token() {
local bucket="$1"
local key="$2"
local deadline=$(($(date +%s) + 3600)) # 凭证1小时后过期仅影响上传不影响文件存储
# 构建上传策略 - 只使用bucket作为scope允许上传到任意文件名
local scope="${bucket}"
local put_policy="{\"scope\":\"${scope}\",\"deadline\":${deadline}}"
# Base64编码上传策略按照七牛云官方文档先base64再替换+/为-_policy需要去掉=
local encoded_put_policy=$(echo -n "$put_policy" | base64 | tr '+/' '-_')
# 使用HMAC-SHA1签名对编码后的策略进行签名
# 注意签名的base64编码不去掉=号!
local sign=$(echo -n "$encoded_put_policy" | openssl dgst -sha1 -hmac "$QINIU_SECRET_KEY" -binary | base64 | tr '+/' '-_')
# 生成上传凭证
echo "${QINIU_ACCESS_KEY}:${sign}:${encoded_put_policy}"
}
# 生成上传凭证
echo "正在生成上传凭证..."
UPLOAD_TOKEN=$(generate_upload_token "$BUCKET" "$KEY")
# 上传文件
echo "正在上传文件: $FILE_PATH$QINIU_BUCKET/$KEY"
RESPONSE=$(curl -s -X POST \
-F "token=${UPLOAD_TOKEN}" \
-F "key=${KEY}" \
-F "file=@${FILE_PATH}" \
"${QINIU_UPLOAD_URL}")
# 检查响应
if [[ $? -eq 0 ]]; then
# 检查是否包含错误
if echo "$RESPONSE" | grep -q "error"; then
echo "上传失败:"
echo "$RESPONSE" | python3 -m json.tool 2>/dev/null || echo "$RESPONSE"
exit 1
else
echo "上传成功!"
# 尝试解析并显示文件信息
if command -v python3 &> /dev/null; then
echo "$RESPONSE" | python3 -c "
import json, sys
try:
data = json.load(sys.stdin)
print(f\"文件名: {data.get('key', 'N/A')}\")
print(f\"Hash: {data.get('hash', 'N/A')}\")
except:
pass
" 2>/dev/null
fi
# 显示下载地址
DOWNLOAD_URL="${QINIU_DOMAIN}/${KEY}"
echo ""
echo "下载地址: ${DOWNLOAD_URL}"
echo ""
# 返回下载地址给调用者
echo "${DOWNLOAD_URL}" > /tmp/qiniu_upload_url.txt
fi
else
echo "上传失败: 网络请求错误"
exit 1
fi