choose_image_handler.dart 2.68 KB
import 'dart:io';

import 'package:appframe/services/dispatcher.dart';
import 'package:image_picker/image_picker.dart';
import 'package:path/path.dart' as path;
import 'package:path_provider/path_provider.dart';

class ChooseImageHandler implements MessageHandler {
  @override
  Future<dynamic> handleMessage(Map<String, dynamic> params) async {

    try {
      // 初始化图片选择器
      final ImagePicker picker = ImagePicker();

      // 选择图片
      final XFile? pickedFile = await picker.pickImage(
        source: ImageSource.gallery, // 可以改为 ImageSource.camera 用于拍照
      );

      if (pickedFile != null) {
        // 获取临时目录
        final Directory tempDir = await getTemporaryDirectory();

        // 生成唯一文件名
        final String fileName = path.basename(pickedFile.path);
        final String uniqueFileName = '${DateTime.now().millisecondsSinceEpoch}_$fileName';

        // 创建目标文件路径
        final String tempFilePath = path.join(tempDir.path, uniqueFileName);

        // 复制文件到临时目录
        final File copiedFile = await File(pickedFile.path).copy(tempFilePath);

        // 返回临时文件路径
        // 前面加上特殊路径,用于后续处理
        return "/temp${copiedFile.path}";
      }

      return null; // 用户取消选择
    } catch (e) {
      print(e);
      return null;
    }
  }

  Future<List<Map<String, dynamic>>?> _selectOne(String sourceType) async {
    final ImagePicker picker = ImagePicker();

    final XFile? pickedFile = await picker.pickImage(
      source: sourceType == 'album' ? ImageSource.gallery : ImageSource.camera,
    );

    if (pickedFile != null) {
      // 获取临时目录
      final Directory tempDir = await getTemporaryDirectory();

      // 生成唯一文件名
      final String fileName = path.basename(pickedFile.path);
      final String uniqueFileName = '${DateTime.now().millisecondsSinceEpoch}_$fileName';

      // 创建目标文件路径
      final String tempFilePath = path.join(tempDir.path, uniqueFileName);

      // 复制文件到临时目录
      final File copiedFile = await File(pickedFile.path).copy(tempFilePath);
      // 返回一个元素的数组
      return [
        {
          "tempFilePath": "/temp${copiedFile.path}",
          "size": copiedFile.lengthSync(),
          "fileType": copiedFile.path.split('/').last.split('.').last,
        },
      ];
    } else {
      return null;
    }
  }

  /*Future<List<Map<String, dynamic>>?> _selectMulti(int count, String sourceType) async {
    final ImagePicker picker = ImagePicker();
    List<XFile> fileList = await picker.pickMultiImage();
    if (fileList.isNotEmpty) {

    }
  }*/
}