#!/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