|
@@ -0,0 +1,306 @@
|
|
|
|
|
+#!/bin/bash
|
|
|
|
|
+
|
|
|
|
|
+# ============================================
|
|
|
|
|
+# 文件上传接口测试脚本
|
|
|
|
|
+# ============================================
|
|
|
|
|
+# 使用方法: ./test_upload_api.sh [host] [port]
|
|
|
|
|
+# 示例: ./test_upload_api.sh localhost 8003
|
|
|
|
|
+# ============================================
|
|
|
|
|
+
|
|
|
|
|
+# 配置参数
|
|
|
|
|
+HOST=${1:-localhost}
|
|
|
|
|
+PORT=${2:-8003}
|
|
|
|
|
+BASE_URL="http://${HOST}:${PORT}"
|
|
|
|
|
+UPLOAD_URL="${BASE_URL}/api/v1/parse/upload"
|
|
|
|
|
+STATUS_URL="${BASE_URL}/parse/status"
|
|
|
|
|
+
|
|
|
|
|
+# 测试文件路径(相对于脚本所在目录)
|
|
|
|
|
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
|
|
|
+TEST_FILE="${SCRIPT_DIR}/test.docx"
|
|
|
|
|
+
|
|
|
|
|
+# 测试用户ID
|
|
|
|
|
+USER_ID="test-user-$(date +%s)"
|
|
|
|
|
+
|
|
|
|
|
+# 颜色定义
|
|
|
|
|
+RED='\033[0;31m'
|
|
|
|
|
+GREEN='\033[0;32m'
|
|
|
|
|
+YELLOW='\033[1;33m'
|
|
|
|
|
+BLUE='\033[0;34m'
|
|
|
|
|
+NC='\033[0m' # No Color
|
|
|
|
|
+
|
|
|
|
|
+# 输出函数
|
|
|
|
|
+print_header() {
|
|
|
|
|
+ echo -e "\n${BLUE}============================================${NC}"
|
|
|
|
|
+ echo -e "${BLUE}$1${NC}"
|
|
|
|
|
+ echo -e "${BLUE}============================================${NC}"
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+print_success() {
|
|
|
|
|
+ echo -e "${GREEN}✓ $1${NC}"
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+print_error() {
|
|
|
|
|
+ echo -e "${RED}✗ $1${NC}"
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+print_info() {
|
|
|
|
|
+ echo -e "${YELLOW}➤ $1${NC}"
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+# 检查依赖
|
|
|
|
|
+check_dependencies() {
|
|
|
|
|
+ print_header "检查依赖"
|
|
|
|
|
+
|
|
|
|
|
+ if ! command -v curl &> /dev/null; then
|
|
|
|
|
+ print_error "curl 未安装"
|
|
|
|
|
+ exit 1
|
|
|
|
|
+ fi
|
|
|
|
|
+ print_success "curl 已安装"
|
|
|
|
|
+
|
|
|
|
|
+ if ! command -v jq &> /dev/null; then
|
|
|
|
|
+ print_info "jq 未安装,JSON格式化将不可用"
|
|
|
|
|
+ JQ_AVAILABLE=false
|
|
|
|
|
+ else
|
|
|
|
|
+ print_success "jq 已安装"
|
|
|
|
|
+ JQ_AVAILABLE=true
|
|
|
|
|
+ fi
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+# 检查测试文件
|
|
|
|
|
+check_test_file() {
|
|
|
|
|
+ print_header "检查测试文件"
|
|
|
|
|
+
|
|
|
|
|
+ if [ ! -f "$TEST_FILE" ]; then
|
|
|
|
|
+ print_error "测试文件不存在: $TEST_FILE"
|
|
|
|
|
+ exit 1
|
|
|
|
|
+ fi
|
|
|
|
|
+
|
|
|
|
|
+ FILE_SIZE=$(stat -c%s "$TEST_FILE" 2>/dev/null || stat -f%z "$TEST_FILE" 2>/dev/null)
|
|
|
|
|
+ print_success "测试文件存在: $TEST_FILE"
|
|
|
|
|
+ print_info "文件大小: $FILE_SIZE bytes"
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+# 检查服务是否可用
|
|
|
|
|
+check_service() {
|
|
|
|
|
+ print_header "检查服务状态"
|
|
|
|
|
+
|
|
|
|
|
+ print_info "测试服务: $BASE_URL"
|
|
|
|
|
+
|
|
|
|
|
+ HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout 5 "${BASE_URL}/actuator/health" 2>/dev/null)
|
|
|
|
|
+
|
|
|
|
|
+ if [ "$HTTP_CODE" = "200" ]; then
|
|
|
|
|
+ print_success "服务正常运行 (HTTP $HTTP_CODE)"
|
|
|
|
|
+ elif [ "$HTTP_CODE" = "000" ]; then
|
|
|
|
|
+ print_error "无法连接到服务 $BASE_URL"
|
|
|
|
|
+ print_info "请确保 parse-service 正在运行"
|
|
|
|
|
+ exit 1
|
|
|
|
|
+ else
|
|
|
|
|
+ print_info "健康检查返回 HTTP $HTTP_CODE,继续测试..."
|
|
|
|
|
+ fi
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+# 测试文件上传
|
|
|
|
|
+test_upload() {
|
|
|
|
|
+ print_header "测试文件上传接口"
|
|
|
|
|
+
|
|
|
|
|
+ print_info "上传URL: $UPLOAD_URL"
|
|
|
|
|
+ print_info "用户ID: $USER_ID"
|
|
|
|
|
+ print_info "文件: $TEST_FILE"
|
|
|
|
|
+
|
|
|
|
|
+ echo -e "\n发送请求..."
|
|
|
|
|
+
|
|
|
|
|
+ RESPONSE=$(curl -s -w "\n%{http_code}" \
|
|
|
|
|
+ -X POST "$UPLOAD_URL" \
|
|
|
|
|
+ -H "Content-Type: multipart/form-data" \
|
|
|
|
|
+ -F "file=@${TEST_FILE}" \
|
|
|
|
|
+ -F "userId=${USER_ID}" \
|
|
|
|
|
+ --connect-timeout 10 \
|
|
|
|
|
+ --max-time 300)
|
|
|
|
|
+
|
|
|
|
|
+ HTTP_CODE=$(echo "$RESPONSE" | tail -n1)
|
|
|
|
|
+ BODY=$(echo "$RESPONSE" | sed '$d')
|
|
|
|
|
+
|
|
|
|
|
+ echo -e "\n${YELLOW}响应状态码:${NC} $HTTP_CODE"
|
|
|
|
|
+ echo -e "${YELLOW}响应内容:${NC}"
|
|
|
|
|
+
|
|
|
|
|
+ if [ "$JQ_AVAILABLE" = true ]; then
|
|
|
|
|
+ echo "$BODY" | jq . 2>/dev/null || echo "$BODY"
|
|
|
|
|
+ else
|
|
|
|
|
+ echo "$BODY"
|
|
|
|
|
+ fi
|
|
|
|
|
+
|
|
|
|
|
+ # 解析响应
|
|
|
|
|
+ if [ "$HTTP_CODE" = "200" ]; then
|
|
|
|
|
+ print_success "文件上传成功!"
|
|
|
|
|
+
|
|
|
|
|
+ # 提取documentId用于后续状态查询
|
|
|
|
|
+ if [ "$JQ_AVAILABLE" = true ]; then
|
|
|
|
|
+ DOCUMENT_ID=$(echo "$BODY" | jq -r '.data.documentId // .documentId // empty' 2>/dev/null)
|
|
|
|
|
+ if [ -n "$DOCUMENT_ID" ] && [ "$DOCUMENT_ID" != "null" ]; then
|
|
|
|
|
+ print_info "文档ID: $DOCUMENT_ID"
|
|
|
|
|
+ echo "$DOCUMENT_ID" > "${SCRIPT_DIR}/.last_document_id"
|
|
|
|
|
+
|
|
|
|
|
+ # 查询解析状态
|
|
|
|
|
+ test_parse_status "$DOCUMENT_ID"
|
|
|
|
|
+ fi
|
|
|
|
|
+ fi
|
|
|
|
|
+ else
|
|
|
|
|
+ print_error "文件上传失败 (HTTP $HTTP_CODE)"
|
|
|
|
|
+ fi
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+# 测试解析状态查询
|
|
|
|
|
+test_parse_status() {
|
|
|
|
|
+ local DOC_ID=$1
|
|
|
|
|
+
|
|
|
|
|
+ print_header "查询解析状态"
|
|
|
|
|
+
|
|
|
|
|
+ print_info "文档ID: $DOC_ID"
|
|
|
|
|
+ print_info "状态URL: ${STATUS_URL}/${DOC_ID}"
|
|
|
|
|
+
|
|
|
|
|
+ # 等待一会儿让解析任务开始
|
|
|
|
|
+ sleep 2
|
|
|
|
|
+
|
|
|
|
|
+ RESPONSE=$(curl -s -w "\n%{http_code}" \
|
|
|
|
|
+ -X GET "${STATUS_URL}/${DOC_ID}" \
|
|
|
|
|
+ --connect-timeout 10)
|
|
|
|
|
+
|
|
|
|
|
+ HTTP_CODE=$(echo "$RESPONSE" | tail -n1)
|
|
|
|
|
+ BODY=$(echo "$RESPONSE" | sed '$d')
|
|
|
|
|
+
|
|
|
|
|
+ echo -e "\n${YELLOW}响应状态码:${NC} $HTTP_CODE"
|
|
|
|
|
+ echo -e "${YELLOW}响应内容:${NC}"
|
|
|
|
|
+
|
|
|
|
|
+ if [ "$JQ_AVAILABLE" = true ]; then
|
|
|
|
|
+ echo "$BODY" | jq . 2>/dev/null || echo "$BODY"
|
|
|
|
|
+ else
|
|
|
|
|
+ echo "$BODY"
|
|
|
|
|
+ fi
|
|
|
|
|
+
|
|
|
|
|
+ if [ "$HTTP_CODE" = "200" ]; then
|
|
|
|
|
+ print_success "状态查询成功!"
|
|
|
|
|
+ else
|
|
|
|
|
+ print_error "状态查询失败 (HTTP $HTTP_CODE)"
|
|
|
|
|
+ fi
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+# 轮询解析状态直到完成
|
|
|
|
|
+poll_parse_status() {
|
|
|
|
|
+ local DOC_ID=$1
|
|
|
|
|
+ local MAX_ATTEMPTS=${2:-30}
|
|
|
|
|
+ local INTERVAL=${3:-5}
|
|
|
|
|
+
|
|
|
|
|
+ print_header "轮询解析状态 (最多${MAX_ATTEMPTS}次, 间隔${INTERVAL}秒)"
|
|
|
|
|
+
|
|
|
|
|
+ for ((i=1; i<=MAX_ATTEMPTS; i++)); do
|
|
|
|
|
+ print_info "第 $i 次查询..."
|
|
|
|
|
+
|
|
|
|
|
+ RESPONSE=$(curl -s "${STATUS_URL}/${DOC_ID}" --connect-timeout 10)
|
|
|
|
|
+
|
|
|
|
|
+ if [ "$JQ_AVAILABLE" = true ]; then
|
|
|
|
|
+ STATUS=$(echo "$RESPONSE" | jq -r '.data.parseStatus // .parseStatus // empty' 2>/dev/null)
|
|
|
|
|
+ echo "当前状态: $STATUS"
|
|
|
|
|
+
|
|
|
|
|
+ if [ "$STATUS" = "2" ] || [ "$STATUS" = "COMPLETED" ]; then
|
|
|
|
|
+ print_success "解析完成!"
|
|
|
|
|
+ echo "$RESPONSE" | jq .
|
|
|
|
|
+ return 0
|
|
|
|
|
+ elif [ "$STATUS" = "3" ] || [ "$STATUS" = "FAILED" ]; then
|
|
|
|
|
+ print_error "解析失败!"
|
|
|
|
|
+ echo "$RESPONSE" | jq .
|
|
|
|
|
+ return 1
|
|
|
|
|
+ fi
|
|
|
|
|
+ else
|
|
|
|
|
+ echo "$RESPONSE"
|
|
|
|
|
+ fi
|
|
|
|
|
+
|
|
|
|
|
+ sleep $INTERVAL
|
|
|
|
|
+ done
|
|
|
|
|
+
|
|
|
|
|
+ print_error "轮询超时"
|
|
|
|
|
+ return 1
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+# 显示使用帮助
|
|
|
|
|
+show_help() {
|
|
|
|
|
+ echo "使用方法: $0 [选项] [host] [port]"
|
|
|
|
|
+ echo ""
|
|
|
|
|
+ echo "选项:"
|
|
|
|
|
+ echo " -h, --help 显示帮助信息"
|
|
|
|
|
+ echo " -p, --poll 上传后轮询解析状态直到完成"
|
|
|
|
|
+ echo " -s, --status 仅查询上次上传的文档状态"
|
|
|
|
|
+ echo ""
|
|
|
|
|
+ echo "示例:"
|
|
|
|
|
+ echo " $0 # 使用默认配置 (localhost:8003)"
|
|
|
|
|
+ echo " $0 192.168.1.100 8003 # 指定服务器地址"
|
|
|
|
|
+ echo " $0 -p # 上传并轮询状态"
|
|
|
|
|
+ echo " $0 -s # 查询上次上传的状态"
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+# 主函数
|
|
|
|
|
+main() {
|
|
|
|
|
+ local POLL_STATUS=false
|
|
|
|
|
+ local STATUS_ONLY=false
|
|
|
|
|
+
|
|
|
|
|
+ # 解析参数
|
|
|
|
|
+ while [[ $# -gt 0 ]]; do
|
|
|
|
|
+ case $1 in
|
|
|
|
|
+ -h|--help)
|
|
|
|
|
+ show_help
|
|
|
|
|
+ exit 0
|
|
|
|
|
+ ;;
|
|
|
|
|
+ -p|--poll)
|
|
|
|
|
+ POLL_STATUS=true
|
|
|
|
|
+ shift
|
|
|
|
|
+ ;;
|
|
|
|
|
+ -s|--status)
|
|
|
|
|
+ STATUS_ONLY=true
|
|
|
|
|
+ shift
|
|
|
|
|
+ ;;
|
|
|
|
|
+ *)
|
|
|
|
|
+ if [[ -z "$HOST_ARG" ]]; then
|
|
|
|
|
+ HOST=$1
|
|
|
|
|
+ elif [[ -z "$PORT_ARG" ]]; then
|
|
|
|
|
+ PORT=$1
|
|
|
|
|
+ fi
|
|
|
|
|
+ shift
|
|
|
|
|
+ ;;
|
|
|
|
|
+ esac
|
|
|
|
|
+ done
|
|
|
|
|
+
|
|
|
|
|
+ # 更新URL
|
|
|
|
|
+ BASE_URL="http://${HOST}:${PORT}"
|
|
|
|
|
+ UPLOAD_URL="${BASE_URL}/api/v1/parse/upload"
|
|
|
|
|
+ STATUS_URL="${BASE_URL}/parse/status"
|
|
|
|
|
+
|
|
|
|
|
+ print_header "文件上传接口测试"
|
|
|
|
|
+ echo "目标服务: $BASE_URL"
|
|
|
|
|
+ echo "时间: $(date '+%Y-%m-%d %H:%M:%S')"
|
|
|
|
|
+
|
|
|
|
|
+ check_dependencies
|
|
|
|
|
+
|
|
|
|
|
+ if [ "$STATUS_ONLY" = true ]; then
|
|
|
|
|
+ if [ -f "${SCRIPT_DIR}/.last_document_id" ]; then
|
|
|
|
|
+ DOCUMENT_ID=$(cat "${SCRIPT_DIR}/.last_document_id")
|
|
|
|
|
+ test_parse_status "$DOCUMENT_ID"
|
|
|
|
|
+ else
|
|
|
|
|
+ print_error "未找到上次上传的文档ID"
|
|
|
|
|
+ exit 1
|
|
|
|
|
+ fi
|
|
|
|
|
+ exit 0
|
|
|
|
|
+ fi
|
|
|
|
|
+
|
|
|
|
|
+ check_test_file
|
|
|
|
|
+ check_service
|
|
|
|
|
+ test_upload
|
|
|
|
|
+
|
|
|
|
|
+ if [ "$POLL_STATUS" = true ] && [ -f "${SCRIPT_DIR}/.last_document_id" ]; then
|
|
|
|
|
+ DOCUMENT_ID=$(cat "${SCRIPT_DIR}/.last_document_id")
|
|
|
|
|
+ poll_parse_status "$DOCUMENT_ID"
|
|
|
|
|
+ fi
|
|
|
|
|
+
|
|
|
|
|
+ print_header "测试完成"
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+# 运行主函数
|
|
|
|
|
+main "$@"
|