lrj
1 天以前 ae3349d2ff53767b5bc9cb30e1bf7e15f9e814ee
web/src/api/media.js
@@ -86,42 +86,23 @@
};
export const deleteMedia = async (id) => {
  console.log('=== deleteMedia API调用 ===');
  console.log('要删除的媒体ID:', id);
  console.log('GraphQL查询:', DELETE_MEDIA_MUTATION);
  // 获取JWT token
  const { getToken } = await import('@/utils/auth');
  const token = getToken();
  const headers = { 'Content-Type': 'application/json' };
  if (token) {
    headers['Authorization'] = `Bearer ${token}`;
  try {
    const variables = { id: parseInt(id) };
    // 发送GraphQL请求
    const result = await graphqlRequest(DELETE_MEDIA_MUTATION, variables);
    // 检查返回结果
    const deleteResult = result.data?.deleteMedia;
    return deleteResult;
  } catch (error) {
    throw new Error(`删除媒体失败: ${error.message}`);
  }
  const res = await fetch(GRAPHQL_ENDPOINT, {
    method: 'POST',
    headers: headers,
    body: JSON.stringify({
      query: DELETE_MEDIA_MUTATION,
      variables: { id: id.toString() }
    })
  });
  const result = await res.json();
  console.log('GraphQL响应:', result);
  console.log('deleteMedia结果:', result.data?.deleteMedia);
  if (result.errors) {
    console.error('GraphQL错误:', result.errors);
    throw new Error(result.errors[0].message);
  }
  const deleteResult = result.data.deleteMedia;
  console.log('返回的删除结果:', deleteResult, '类型:', typeof deleteResult);
  return deleteResult;
};
// 上传文件到服务器
export const uploadFile = async (file) => {
// 上传文件到服务器(带重试机制)
export const uploadFile = async (file, maxRetries = 3) => {
  const formData = new FormData();
  formData.append('file', file);
  
@@ -133,18 +114,56 @@
    headers['Authorization'] = `Bearer ${token}`;
  }
  
  const response = await fetch('http://localhost:8080/api/upload/image', {
    method: 'POST',
    headers: headers,
    body: formData
  });
  let lastError;
  
  const result = await response.json();
  if (!result.success) {
    throw new Error(result.error || '上传失败');
  for (let attempt = 1; attempt <= maxRetries; attempt++) {
    try {
      const response = await fetch('http://localhost:8080/api/upload/image', {
        method: 'POST',
        headers: headers,
        body: formData,
        // 添加超时设置
        signal: AbortSignal.timeout(30000) // 30秒超时
      });
      if (!response.ok) {
        throw new Error(`HTTP ${response.status}: ${response.statusText}`);
      }
      const result = await response.json();
      if (!result.success) {
        throw new Error(result.error || '上传失败');
      }
      return result;
    } catch (error) {
      lastError = error;
      console.warn(`文件上传第${attempt}次尝试失败:`, error.message);
      // 如果是最后一次尝试,或者是非网络错误,直接抛出
      if (attempt === maxRetries ||
          (!error.message.includes('Failed to fetch') &&
           !error.message.includes('ERR_CONNECTION_RESET') &&
           !error.message.includes('ERR_NETWORK'))) {
        break;
      }
      // 等待一段时间后重试(指数退避)
      const delay = Math.min(1000 * Math.pow(2, attempt - 1), 5000);
      await new Promise(resolve => setTimeout(resolve, delay));
    }
  }
  
  return result;
  // 提供更友好的错误信息
  if (lastError.message.includes('Failed to fetch') ||
      lastError.message.includes('ERR_CONNECTION_RESET') ||
      lastError.message.includes('ERR_NETWORK')) {
    throw new Error('网络连接失败,请检查网络连接或稍后重试');
  } else if (lastError.message.includes('timeout')) {
    throw new Error('上传超时,请检查网络连接或稍后重试');
  } else {
    throw new Error(`上传失败: ${lastError.message}`);
  }
};
// 上传视频文件并自动生成缩略图
@@ -152,17 +171,11 @@
  const { extractVideoFrame, generateThumbnailFileName } = await import('@/utils/video.js');
  
  try {
    console.log('开始处理视频文件:', videoFile.name);
    // 1. 上传原视频文件
    console.log('上传视频文件...');
    // 1. 上传视频文件
    const videoUploadResult = await uploadFile(videoFile);
    console.log('视频上传成功:', videoUploadResult);
    
    // 2. 提取视频第一帧
    console.log('提取视频第一帧...');
    const thumbnailBlob = await extractVideoFrame(videoFile);
    console.log('视频帧提取成功,大小:', thumbnailBlob.size);
    
    // 3. 创建缩略图文件对象
    const thumbnailFileName = generateThumbnailFileName(videoFile.name);
@@ -171,9 +184,7 @@
    });
    
    // 4. 上传缩略图
    console.log('上传缩略图...');
    const thumbnailUploadResult = await uploadFile(thumbnailFile);
    console.log('缩略图上传成功:', thumbnailUploadResult);
    
    // 5. 返回包含视频和缩略图信息的结果
    return {