From db6c19dae12671984807f9c401ef90b1b952bc3a Mon Sep 17 00:00:00 2001 From: imeepos Date: Sun, 28 Sep 2025 15:54:59 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=8C=E5=96=84BowongAI=20SDK?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=A4=84=E7=90=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复_getExt方法中PNG类型映射错误 - 新增_generateFileName辅助方法,确保文件名包含正确扩展名 - 优化H5和普通上传方法的文件名生成逻辑 - 增强MIME类型与扩展名映射支持 - 提升跨平台文件处理一致性 --- src/sdk/bowongAISDK.ts | 73 +++++++++++++++++++++++++++++++----------- 1 file changed, 54 insertions(+), 19 deletions(-) diff --git a/src/sdk/bowongAISDK.ts b/src/sdk/bowongAISDK.ts index a594d9f..e61fa22 100644 --- a/src/sdk/bowongAISDK.ts +++ b/src/sdk/bowongAISDK.ts @@ -94,7 +94,7 @@ export class BowongAISDK { } // 自动生成文件名(如果未提供) - const fileName = name || `upload_${Date.now()}_${this._getFileExtension(filePath)}`; + const fileName = this._generateFileName(filePath, name, type); // 自动判断文件类型(如果未提供) const fileType = type || this._getMimeType(filePath); @@ -106,12 +106,12 @@ export class BowongAISDK { // 创建FormData const formData = new FormData(); - + // 在H5环境中,需要先将filePath转换为File对象 const response = await fetch(filePath); const blob = await response.blob(); const file = new File([blob], fileName, { type: fileType }); - + formData.append('file', file); formData.append('filename', fileName); formData.append('type', fileType); @@ -164,13 +164,13 @@ export class BowongAISDK { if (img_file) { // 创建FormData const formData = new FormData(); - + // 在H5环境中,需要先将filePath转换为File对象 const response = await fetch(img_file); const blob = await response.blob(); const fileName = `generate_${Date.now()}.${this._getFileExtension(img_file)}`; const file = new File([blob], fileName, { type: this._getMimeType(img_file) }); - + formData.append('img_file', file); formData.append('prompt', prompt); formData.append('model_name', model_name); @@ -238,7 +238,7 @@ export class BowongAISDK { fileInfo = { size: 0 }; } // 自动生成文件名(如果未提供) - const fileName = name || `upload_${Date.now()}.${this._getFileExtension(filePath)}`; + const fileName = this._generateFileName(filePath, name, type); // 自动判断文件类型(如果未提供) const fileType = type || this._getMimeType(filePath); @@ -363,14 +363,14 @@ export class BowongAISDK { } catch (error) { console.error('选择并上传图片失败:', error); - + // 检查是否是授权被拒绝的错误 if (this._isAuthorizationError(error)) { await this._handleAuthorizationError(); // 用户重新授权后,递归调用自己重试 return this.chooseAndUploadImage(options); } - + throw error; } } @@ -383,13 +383,13 @@ export class BowongAISDK { if (!error || typeof error.errMsg !== 'string') { return false; } - + const errMsg = error.errMsg.toLowerCase(); - return errMsg.includes('auth') || - errMsg.includes('permission') || - errMsg.includes('denied') || - errMsg.includes('authorize') || - errMsg.includes('scope'); + return errMsg.includes('auth') || + errMsg.includes('permission') || + errMsg.includes('denied') || + errMsg.includes('authorize') || + errMsg.includes('scope'); } /** @@ -411,9 +411,9 @@ export class BowongAISDK { success: (settingResult) => { console.log('用户设置结果:', settingResult); // 检查是否授权了相册权限 - if (settingResult.authSetting && - (settingResult.authSetting['scope.writePhotosAlbum'] || - settingResult.authSetting['scope.camera'])) { + if (settingResult.authSetting && + (settingResult.authSetting['scope.writePhotosAlbum'] || + settingResult.authSetting['scope.camera'])) { Taro.showToast({ title: '授权成功', icon: 'success', @@ -501,14 +501,14 @@ export class BowongAISDK { } catch (error) { console.error('选择并上传图片失败:', error); - + // 检查是否是授权被拒绝的错误 if (this._isAuthorizationError(error)) { await this._handleAuthorizationError(); // 用户重新授权后,递归调用自己重试 return this.chooseAndGenerateImage(options); } - + throw error; } } @@ -541,6 +541,41 @@ export class BowongAISDK { return mimeTypes[extension] || 'application/octet-stream'; } + private _getExt(type: string): string { + const mimeTypes: Record = { + 'image/jpeg': 'jpg', + 'image/png': 'png', + 'image/gif': 'gif', + 'image/webp': 'webp', + 'video/mp4': 'mp4', + 'video/quicktime': 'mov', + 'video/x-msvideo': 'avi' + }; + return mimeTypes[type] || 'jpg'; + } + + /** + * 生成文件名,确保包含正确的扩展名 + * @private + */ + private _generateFileName(filePath: string, name?: string, type?: string): string { + // 如果提供了名称,使用提供的名称 + if (name) { + // 检查名称是否包含扩展名 + if (name.includes('.')) { + return name; + } + // 没有扩展名,需要添加 + const fileType = type || this._getMimeType(filePath); + const extension = this._getExt(fileType); + return `${name}.${extension}`; + } + + // 没有提供名称,自动生成 + const fileExtension = this._getFileExtension(filePath); + return `upload_${Date.now()}.${fileExtension}`; + } + /** * 生成图像 * @param params 图像生成参数