mirror of
https://github.com/LLM-Red-Team/kimi-free-api.git
synced 2024-11-01 18:29:19 +08:00
支持解析BASE64文件数据
This commit is contained in:
parent
e193e905f3
commit
84353391cd
@ -53,6 +53,8 @@ Authorization: Bearer [refresh_token]
|
||||
|
||||
### 文件上传解读
|
||||
|
||||
提供一个可访问的文件URL或者BASE64_URL进行解析。
|
||||
|
||||
请求数据:
|
||||
```json
|
||||
{
|
||||
@ -105,6 +107,8 @@ Authorization: Bearer [refresh_token]
|
||||
|
||||
### 图像解析
|
||||
|
||||
提供一个可访问的图像URL或者BASE64_URL进行解析。
|
||||
|
||||
此格式兼容 [gpt-4-vision-preview](https://platform.openai.com/docs/guides/vision) API格式,您也可以用这个格式传送文档进行解析。
|
||||
|
||||
请求数据:
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "kimi-free-api",
|
||||
"version": "0.0.7",
|
||||
"version": "0.0.8",
|
||||
"description": "Kimi Free API Server",
|
||||
"type": "module",
|
||||
"main": "dist/index.js",
|
||||
|
@ -298,6 +298,8 @@ async function preSignUrl(filename: string, refreshToken: string) {
|
||||
* @param fileUrl 文件URL
|
||||
*/
|
||||
async function checkFileUrl(fileUrl: string) {
|
||||
if(util.isBASE64Data(fileUrl))
|
||||
return;
|
||||
const result = await axios.head(fileUrl, {
|
||||
timeout: 15000,
|
||||
validateStatus: () => true
|
||||
@ -322,24 +324,34 @@ async function uploadFile(fileUrl: string, refreshToken: string) {
|
||||
// 预检查远程文件URL可用性
|
||||
await checkFileUrl(fileUrl);
|
||||
|
||||
let filename, fileData, mimeType;
|
||||
// 如果是BASE64数据则直接转换为Buffer
|
||||
if(util.isBASE64Data(fileUrl)) {
|
||||
mimeType = util.extractBASE64DataFormat(fileUrl);
|
||||
const ext = mime.getExtension(mimeType);
|
||||
filename = `${util.uuid()}.${ext}`;
|
||||
fileData = Buffer.from(util.removeBASE64DataHeader(fileUrl), 'base64');
|
||||
}
|
||||
// 下载文件到内存,如果您的服务器内存很小,建议考虑改造为流直传到下一个接口上,避免停留占用内存
|
||||
const filename = path.basename(fileUrl);
|
||||
const { data: fileData } = await axios.get(fileUrl, {
|
||||
responseType: 'arraybuffer',
|
||||
// 100M限制
|
||||
maxContentLength: FILE_MAX_SIZE,
|
||||
// 60秒超时
|
||||
timeout: 60000
|
||||
});
|
||||
else {
|
||||
filename = path.basename(fileUrl);
|
||||
({ data: fileData } = await axios.get(fileUrl, {
|
||||
responseType: 'arraybuffer',
|
||||
// 100M限制
|
||||
maxContentLength: FILE_MAX_SIZE,
|
||||
// 60秒超时
|
||||
timeout: 60000
|
||||
}));
|
||||
}
|
||||
|
||||
// 获取预签名文件URL
|
||||
const {
|
||||
url: uploadUrl,
|
||||
object_name: objectName
|
||||
} = await preSignUrl(filename, refreshToken);
|
||||
|
||||
|
||||
// 获取文件的MIME类型
|
||||
const mimeType = mime.getType(filename);
|
||||
mimeType = mimeType || mime.getType(filename);
|
||||
// 上传文件到目标OSS
|
||||
const token = await acquireToken(refreshToken);
|
||||
let result = await axios.request({
|
||||
|
@ -23,7 +23,7 @@ const startupTime = performance.now();
|
||||
await server.listen();
|
||||
|
||||
config.service.bindAddress &&
|
||||
logger.success("service bind address:", config.service.bindAddress);
|
||||
logger.success("Service bind address:", config.service.bindAddress);
|
||||
})()
|
||||
.then(() =>
|
||||
logger.success(
|
||||
|
@ -136,18 +136,18 @@ const util = {
|
||||
return !_.isUndefined(value) && /^[a-zA-Z0-9\/\+]+(=?)+$/.test(value);
|
||||
},
|
||||
|
||||
isBASE64Image(value) {
|
||||
return /^data:image/.test(value);
|
||||
isBASE64Data(value) {
|
||||
return /^data:/.test(value);
|
||||
},
|
||||
|
||||
extractBASE64ImageFormat(value): string | null {
|
||||
const match = value.trim().match(/^data:image\/(.+);base64,/);
|
||||
extractBASE64DataFormat(value): string | null {
|
||||
const match = value.trim().match(/^data:(.+);base64,/);
|
||||
if(!match) return null;
|
||||
return match[1];
|
||||
},
|
||||
|
||||
removeBASE64ImageHeader(value): string {
|
||||
return value.replace(/^data:image\/(.+);base64,/, "");
|
||||
removeBASE64DataHeader(value): string {
|
||||
return value.replace(/^data:(.+);base64,/, "");
|
||||
},
|
||||
|
||||
isDataString(value): boolean {
|
||||
|
Loading…
Reference in New Issue
Block a user