File size: 2,978 Bytes
121e67d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
const axios = require('axios')
const FormData = require('form-data')
const imageCache = require('./caches')
const manager = require('./manager')


async function uploadFileBuffer(fileBuffer) {
  try {
    const account = await manager.getAccount()
    
    // 检查account是否存在
    if (!account) {
      console.error('无法获取有效的账户')
      return { success: false, error: '账户获取失败' }
    }
    
    const authToken = account.token
    
    // 检查token是否存在
    if (!authToken) {
      console.error('无法获取有效的认证token')
      return { success: false, error: '认证失败' }
    }
    
    // 转换为base64用于缓存检查
    const base64Data = fileBuffer.toString('base64')
    
    // 检查缓存中是否已存在此图片
    const cachedUrl = imageCache.getImageUrl(base64Data)
    if (cachedUrl) {
      console.log('使用缓存的图片URL:', cachedUrl)
      return { success: true, file_url: cachedUrl }
    }
    
    // 创建表单数据
    const form = new FormData()

    // 添加文件内容到表单,使用正确的文件名和content-type
    form.append('file', fileBuffer, {
      filename: `image_${Date.now()}.png`,
      contentType: 'image/png'
    })

    // 设置请求头,添加必要的浏览器相关头信息
    const headers = {
      ...form.getHeaders(),
      'Authorization': `Bearer ${authToken}`,
      'Accept': '*/*',
      'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
      'Origin': 'https://dashboard.promptlayer.com',
      'Referer': 'https://dashboard.promptlayer.com/',
      'Sec-Ch-Ua': '"Chromium";v="136", "Microsoft Edge";v="136", "Not.A/Brand";v="99"',
      'Sec-Ch-Ua-Mobile': '?0',
      'Sec-Ch-Ua-Platform': '"Windows"',
      'Sec-Fetch-Dest': 'empty',
      'Sec-Fetch-Mode': 'cors',
      'Sec-Fetch-Site': 'same-site',
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0',
    }

    console.log('开始上传图片,大小:', fileBuffer.length, 'bytes')

    // 发送请求
    const response = await axios.post('https://api.promptlayer.com/upload', form, { 
      headers,
      timeout: 30000 // 30秒超时
    })
    
    // 如果上传成功,添加到缓存
    if (response.data && response.data.success && response.data.file_url) {
      imageCache.addImage(base64Data, response.data.file_url)
      console.log('图片上传成功:', response.data.file_url)
    }

    // 返回响应数据
    return response.data
  } catch (error) {
    console.error('图片上传失败:', {
      status: error.response?.status,
      statusText: error.response?.statusText,
      data: error.response?.data,
      message: error.message
    })
    return { success: false, error: error.message }
  }
}

module.exports = {
  uploadFileBuffer
}