save_file_to_disk_handler.dart 1.82 KB
import 'dart:io';

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

class SaveFileToDisKHandler extends MessageHandler {
  @override
  Future<dynamic> handleMessage(params) async {
    if (params is! Map<String, dynamic>) {
      throw Exception('参数错误');
    }

    var filePath = params['filePath'] as String;
    if (filePath.isEmpty) {
      throw Exception('参数错误');
    }

    var fileName = params['fileName'] as String? ?? '';

    // 临时目录
    var dir = await getTemporaryDirectory();
    // 要保存的文件名和扩展名
    String saveFileName, ext;
    if (fileName.isEmpty) {
      saveFileName = path.basenameWithoutExtension(filePath);
      ext = path.extension(filePath);
    } else {
      saveFileName = path.basenameWithoutExtension(fileName);
      ext = path.extension(fileName);
    }
    // 要保存的路径
    var targetPath = path.join(dir.path, '$saveFileName.$ext');
    // 如果文件存在,则在文件名后添加数字
    int i = 1;
    while (File(targetPath).existsSync()) {
      targetPath = path.join(dir.path, '$saveFileName($i).$ext');
      i++;
    }

    if (filePath.startsWith('http')) {
      final resp = await Dio().download(filePath, targetPath);
      if (resp.statusCode != 200) {
        throw Exception('文件下载失败');
      }

      await FilePicker.platform.saveFile(bytes: File(targetPath).readAsBytesSync(), fileName: fileName);

      return true;
    } else {
      var f = File(filePath);
      if (f.existsSync()) {
        await FilePicker.platform.saveFile(bytes: f.readAsBytesSync(), fileName: fileName);
        return true;
      } else {
        return false;
      }
    }
  }
}