chunk-upload-test.sh 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #!/bin/sh
  2. # 大文件分片上传端到端测试脚本:切片 → 逐片上传(md5 校验)→ 查询进度 → 合并 → 校验散列
  3. # 本地与云端(oss / cos / qiniu / s3)通用
  4. #
  5. # 前置条件:
  6. # 1. webman 项目已按 example/UploadController.php + example/route.php 注册分片上传路由
  7. # 2. 配置 storage.algo = 'sha1'(默认值),否则最后的散列校验需换成对应算法
  8. # 3. 云端测试需先在 config/plugin/tinywan/storage/app.php 配置对应 disk 的真实凭证
  9. #
  10. # 用法:
  11. # ./chunk-upload-test.sh <待上传文件> [服务地址]
  12. # 环境变量:
  13. # CHUNK_SIZE 分片大小,默认 5m(需与配置 chunk_size 一致或更小;云端勿低于 5m)
  14. # FILE_ID 文件唯一标识,默认自动生成
  15. # DISK 存储 disk:local / oss / cos / qiniu / s3,默认 local
  16. set -eu
  17. FILE="${1:?用法: $0 <待上传文件> [服务地址]}"
  18. BASE_URL="${2:-http://127.0.0.1:8787}"
  19. CHUNK_SIZE="${CHUNK_SIZE:-5m}"
  20. FILE_ID="${FILE_ID:-demo-$(date +%s)}"
  21. DISK="${DISK:-local}"
  22. FILE_NAME="$(basename "$FILE")"
  23. if [ ! -f "$FILE" ]; then
  24. echo "❌ 文件不存在:$FILE"
  25. exit 1
  26. fi
  27. WORK_DIR="$(mktemp -d)"
  28. trap 'rm -rf "$WORK_DIR"' EXIT
  29. echo "==> 切片(${CHUNK_SIZE}/片)..."
  30. split -b "$CHUNK_SIZE" "$FILE" "$WORK_DIR/chunk_"
  31. TOTAL=$(ls "$WORK_DIR"/chunk_* | wc -l)
  32. echo " 共 ${TOTAL} 片,file_id=${FILE_ID},disk=${DISK}"
  33. echo "==> 逐片上传..."
  34. i=0
  35. for CHUNK in "$WORK_DIR"/chunk_*; do
  36. MD5="$(md5sum "$CHUNK" | awk '{print $1}')"
  37. echo " [$((i + 1))/${TOTAL}] $(basename "$CHUNK") md5=${MD5}"
  38. curl -sf -F "file=@${CHUNK}" -F "file_id=${FILE_ID}" \
  39. -F "chunk_index=${i}" -F "chunk_md5=${MD5}" -F "disk=${DISK}" \
  40. "${BASE_URL}/upload/chunk"
  41. echo
  42. i=$((i + 1))
  43. done
  44. echo "==> 查询上传进度..."
  45. curl -sf "${BASE_URL}/upload/progress?file_id=${FILE_ID}&total_chunks=${TOTAL}&disk=${DISK}"
  46. echo
  47. ORIGIN_SHA1="$(sha1sum "$FILE" | awk '{print $1}')"
  48. echo "==> 合并分片(file_hash=${ORIGIN_SHA1})..."
  49. curl -sf -F "file_id=${FILE_ID}" -F "total_chunks=${TOTAL}" \
  50. -F "file_name=${FILE_NAME}" -F "disk=${DISK}" -F "file_hash=${ORIGIN_SHA1}" \
  51. "${BASE_URL}/upload/merge" | tee "$WORK_DIR/merge.json"
  52. echo
  53. echo "==> 校验散列..."
  54. echo " 原文件 sha1:${ORIGIN_SHA1}"
  55. if grep -q "$ORIGIN_SHA1" "$WORK_DIR/merge.json"; then
  56. echo " ✅ 合并产物散列与原文件一致,测试通过"
  57. else
  58. echo " ❌ 散列不一致,请检查 merge.json 中的 unique_id"
  59. exit 1
  60. fi