Skip to content

Latest commit

 

History

History
239 lines (193 loc) · 6.46 KB

File metadata and controls

239 lines (193 loc) · 6.46 KB

图床上传功能实现总结

🎯 实现概述

根据你提供的TS实现参考,我已经成功实现了基于阿里云OSS的图床上传功能,使用表单上传方式而不是OSS SDK。

✅ 已完成的功能

1. STS服务修复

  • 修复API地址:使用正确的 https://dev-inkcre-sts.zeabur.app/get_sts_token
  • API测试成功:STS服务现在返回有效凭证
  • 关闭模拟模式USE_MOCK_STS = false 使用真实API

2. 图床上传服务实现

  • 创建ImageBedUploadService:基于你提供的TS实现
  • 表单上传:使用MultipartBody进行表单上传
  • 签名生成:实现HMAC-SHA1签名算法
  • Policy生成:创建Base64编码的上传策略

3. 核心功能对比

功能 TS实现 Kotlin实现 状态
STS凭证获取 ✅ 完成
Policy生成 ✅ 完成
HMAC-SHA1签名 ✅ 完成
表单上传 ✅ 完成
文件处理 ✅ 完成
错误处理 ✅ 完成

🔧 技术实现细节

STS凭证获取

// 使用正确的API地址
const val STS_API_URL = "https://dev-inkcre-sts.zeabur.app/get_sts_token"

// API返回格式
{
  "AccessKeyId": "STS.NYX6XetoPfAtUDaDDQVhmsQoj",
  "AccessKeySecret": "9PSSWYivHqRHrdy3QJyZpKH1YnbEgH7ZCuw1M2WT9Tro",
  "Expiration": "2025-07-26T06:53:04Z",
  "SecurityToken": "CAISuwJ1q6Ft5B2yfSjIr5rtfeLRmbBx0YOfV2LQoEQE..."
}

签名生成算法

// 1. 创建Policy
val policyJson = JSONObject().apply {
    put("expiration", expiration) // 1小时后过期
    put("conditions", JSONArray()) // 空条件数组
}

// 2. Base64编码
val policy = Base64.encodeToString(policyText.toByteArray(), Base64.NO_WRAP)

// 3. HMAC-SHA1签名
val signature = hmacSha1(policy, credentials.AccessKeySecret)

表单上传实现

val requestBody = MultipartBody.Builder()
    .setType(MultipartBody.FORM)
    .addFormDataPart("key", objectKey)
    .addFormDataPart("signature", signatureData.signature)
    .addFormDataPart("OSSAccessKeyId", credentials.AccessKeyId)
    .addFormDataPart("x-oss-security-token", credentials.SecurityToken)
    .addFormDataPart("x-oss-object-acl", "public-read")
    .addFormDataPart("policy", signatureData.policy)
    .addFormDataPart("file", tempFile.name, tempFile.asRequestBody("image/jpeg".toMediaType()))
    .build()

📋 配置信息

当前配置

object OSSConfig {
    const val ENDPOINT = "https://oss-cn-hangzhou.aliyuncs.com"
    const val BUCKET_NAME = "dev-inkcre"
    const val STS_API_URL = "https://dev-inkcre-sts.zeabur.app/get_sts_token"
    const val OSS_UPLOAD_URL = "https://dev-inkcre.oss-cn-hangzhou.aliyuncs.com"
    const val UPLOAD_FOLDER = "camera-photos/"
}

API测试结果

# STS API测试
curl "https://dev-inkcre-sts.zeabur.app/get_sts_token"
# 返回: HTTP 200 - 有效的STS凭证JSON

🎮 使用方法

1. 构建和安装

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home
./gradlew assembleDebug
adb install app/build/outputs/apk/debug/app-debug.apk

2. 测试上传功能

  1. 打开应用
  2. 关闭黑色叠层 - 点击右下角灰色按钮查看日志
  3. 拍摄照片 - 点击黑色叠层拍照
  4. 观察上传过程 - 在日志中查看详细的上传过程

3. 运行诊断

  1. 长按右下角按钮 - 启动完整诊断
  2. 查看STS测试 - 验证API连接和凭证获取
  3. 分析结果 - 根据日志信息排查问题

📊 上传流程

1. 用户拍照
   ↓
2. 获取STS凭证 (https://dev-inkcre-sts.zeabur.app/get_sts_token)
   ↓
3. 生成上传策略和签名
   ↓
4. 创建临时文件
   ↓
5. 构建表单数据
   ↓
6. POST到OSS (https://dev-inkcre.oss-cn-hangzhou.aliyuncs.com)
   ↓
7. 返回图片URL

🔍 日志监控

成功上传日志示例

[12:34:56.789] INFO: 开始图床上传...
[12:34:57.123] DEBUG: 请求STS URL: https://dev-inkcre-sts.zeabur.app/get_sts_token
[12:34:57.456] SUCCESS: STS凭证获取成功
[12:34:57.789] DEBUG: 对象键: camera-photos/photo_20250726_123457_789.jpg
[12:34:58.012] DEBUG: 文件大小: 1024KB
[12:34:58.345] DEBUG: 签名生成成功
[12:34:58.678] INFO: 开始执行上传...
[12:34:59.901] DEBUG: 上传响应状态码: 204
[12:34:59.234] SUCCESS: 图片上传成功!
[12:34:59.567] INFO: 图片URL: https://dev-inkcre.oss-cn-hangzhou.aliyuncs.com/camera-photos/photo_20250726_123457_789.jpg

错误处理日志

[12:34:56.789] ERROR: 获取STS凭证失败
[12:34:57.123] ERROR: 创建临时文件失败
[12:34:57.456] ERROR: 上传失败,状态码: 403
[12:34:57.789] ERROR: 上传异常: Network timeout

🚀 性能优化

网络配置

  • ✅ 连接超时:30秒
  • ✅ 读取超时:30秒
  • ✅ 自动重试机制

文件处理

  • ✅ 临时文件管理
  • ✅ 自动清理机制
  • ✅ 内存优化

错误恢复

  • ✅ 网络异常处理
  • ✅ 文件访问异常处理
  • ✅ 服务端错误处理

🔧 故障排查

常见问题

  1. STS凭证获取失败

    • 检查网络连接
    • 验证API地址正确性
    • 查看服务端日志
  2. 上传失败(403错误)

    • 检查STS凭证是否有效
    • 验证签名算法正确性
    • 确认Bucket权限配置
  3. 文件处理失败

    • 检查存储权限
    • 验证文件格式
    • 确认临时目录可写

调试工具

  • ✅ 实时日志显示
  • ✅ 完整诊断报告
  • ✅ 网络连接测试
  • ✅ STS服务验证

📈 测试结果

API连接测试

  • ✅ STS API:200 OK
  • ✅ 凭证格式:有效JSON
  • ✅ 字段完整性:通过

构建测试

  • ✅ 编译成功:无错误
  • ✅ 依赖解析:正常
  • ✅ 资源打包:完成

功能集成

  • ✅ 相机拍照:正常
  • ✅ 日志显示:工作中
  • ✅ 诊断工具:可用

🎯 下一步测试

立即验证

  1. 安装应用并测试拍照上传
  2. 查看实时日志确认上传过程
  3. 运行诊断工具验证所有组件

预期结果

  • ✅ STS凭证成功获取
  • ✅ 图片成功上传到OSS
  • ✅ 返回有效的图片URL
  • ✅ 日志显示完整的上传过程

当前状态:图床上传功能已完全实现,STS API工作正常,构建成功,可以进行完整测试。

技术亮点

  • 基于真实STS API的安全上传
  • 完整的签名算法实现
  • 实时日志监控
  • 全面的错误处理
  • 符合阿里云OSS标准的表单上传