104 lines
3.0 KiB
Bash
Executable File
104 lines
3.0 KiB
Bash
Executable File
#!/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 |