ソースを参照

✨ feat(minio): 新增自动适应环境的文件选择上传函数

- 添加 uploadFromSelect 函数,支持小程序和H5环境下的文件选择与上传
- 小程序环境使用 Taro.chooseImage API 实现图片选择
- H5环境通过动态创建 input[type="file"] 元素实现文件选择
- 支持配置文件来源类型、选择数量、文件类型限制和大小限制
- 添加环境检测逻辑,自动适配不同运行环境的文件选择方式
yourname 4 ヶ月 前
コミット
35fcc1a97c
1 ファイル変更81 行追加1 行削除
  1. 81 1
      mini/src/utils/minio.ts

+ 81 - 1
mini/src/utils/minio.ts

@@ -786,6 +786,85 @@ export async function uploadFromChoose(
   });
 }
 
+// 新增:自动适应运行环境的文件选择并上传函数
+/**
+ * 自动适应运行环境:选择文件并上传到 MinIO
+ * 小程序:使用 Taro.chooseImage
+ * H5:使用 input[type="file"]
+ */
+export async function uploadFromSelect(
+  uploadPath: string = '',
+  options: {
+    sourceType?: ('album' | 'camera')[],
+    count?: number,
+    accept?: string,
+    maxSize?: number,
+  } = {},
+  callbacks?: MinioProgressCallbacks
+): Promise<UploadResult> {
+  const { sourceType = ['album', 'camera'], count = 1, accept = '*', maxSize = 10 * 1024 * 1024 } = options;
+
+  if (isMiniProgram) {
+    return new Promise((resolve, reject) => {
+      if (typeof Taro === 'undefined') {
+        reject(new Error('Taro 环境未找到'));
+        return;
+      }
+      
+      Taro.chooseImage({
+        count,
+        sourceType: sourceType as any, // 确保类型兼容
+        success: async (res) => {
+          const tempFilePath = res.tempFilePaths[0];
+          const fileName = res.tempFiles[0]?.name || tempFilePath.split('/').pop() || 'unnamed-file';
+          
+          try {
+            const result = await uploadMinIOWithPolicy(uploadPath, tempFilePath, fileName, callbacks);
+            resolve(result);
+          } catch (error) {
+            reject(error);
+          }
+        },
+        fail: reject
+      });
+    });
+  } else if (isBrowser) {
+    return new Promise((resolve, reject) => {
+      const input = document.createElement('input');
+      input.type = 'file';
+      input.accept = accept;
+      input.multiple = count > 1;
+      
+      input.onchange = async (event) => {
+        const files = (event.target as HTMLInputElement).files;
+        if (!files || files.length === 0) {
+          reject(new Error('未选择文件'));
+          return;
+        }
+        
+        const file = files[0];
+        if (file.size > maxSize) {
+          reject(new Error(`文件大小超过限制: ${maxSize / 1024 / 1024}MB`));
+          return;
+        }
+        
+        const fileName = file.name || 'unnamed-file';
+        
+        try {
+          const result = await uploadMinIOWithPolicy(uploadPath, file, fileName, callbacks);
+          resolve(result);
+        } catch (error) {
+          reject(error);
+        }
+      };
+      
+      input.click();
+    });
+  } else {
+    throw new Error('不支持的运行环境');
+  }
+}
+
 // 默认导出
 export default {
   MinIOXHRMultipartUploader,
@@ -798,5 +877,6 @@ export default {
   getMultipartUploadPolicy,
   uploadMinIOWithPolicy,
   uploadMinIOWithTaroFile,
-  uploadFromChoose
+  uploadFromChoose,
+  uploadFromSelect
 };