api / src /lib /upload.js
clash-linux's picture
Upload 14 files
121e67d verified
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
}