upload_image_util.dart 12.4 KB
import 'dart:convert';
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';

import 'package:one_key/provider/upload_img_provider.dart';

import 'package:qiniu_flutter_sdk/qiniu_flutter_sdk.dart';

enum UploadType {
  EnvironmentUploadType, //店铺环境
  ConsumptionUploadType, //消费清单
  StoreFrontUploadType, //门头
  HeadUploadType, //头像
  QrcodeUploadType, //二维码
  TableManagerType, //桌面照片管理
  FeastRemarkType, //宴会备注--意向
  FeastRemarkXtType, //宴会备注--选台
  FeastRemarkDjType, //宴会备注--定金
  FeastRemarkContractType, //宴会备注--合同
  FeastRemarkInvoiceType //宴会备注--发票

}

class UploadImageUtil {
  final picker = ImagePicker();

  // 用户输入的文件名
  String key;
  // 用户输入的 partSize
  int partSize = 4;
  // 用户输入的 token
  String token;

  /// storage 实例
  final Storage storage = Storage();
  // 控制器,可以用于取消任务、获取上述的状态,进度等信息
  //  PutController putController = PutController();
  // 当前的任务状态

  ///上传到七牛云
  void startUpload(
      BuildContext context,
      File selectedFile,
      int index,
      bool needInit,
      UploadImageProvider uploadImageProvider,
      UploadType uploadType,
      {int countAll,
      VoidCallback callback}) async {
    final PutController putController = PutController();
    print(index);

    // 添加状态监听
    putController.addStatusListener((StorageStatus status) {
      print('状态变化: 当前任务状态:${status.toString()}');
    });
    // 添加整体进度监听
    putController.addProgressListener((percent) {
      print('${index}任务进度变化:进度:${percent.toStringAsFixed(4)}');
      if (uploadType == UploadType.StoreFrontUploadType) {
        //门头
        uploadImageProvider.imageListFront[index].process = percent;
      } else if (uploadType == UploadType.EnvironmentUploadType) {
        uploadImageProvider.imageListDenvironment[index].process = percent;
      } else if (uploadType == UploadType.ConsumptionUploadType) {
        //消费清单
        uploadImageProvider.imageList[index].process = percent;
      } else if (uploadType == UploadType.TableManagerType) {
        //桌面照片管理
        uploadImageProvider.tableImageList[index].process = percent;
      } else if (uploadType == UploadType.FeastRemarkType) {
        //宴会备注 ---意向
        uploadImageProvider.feastRemarkImageList[index].process = percent;
      } else if (uploadType == UploadType.FeastRemarkXtType) {
        //宴会备注 ---选台
        uploadImageProvider.feastRemarkXtImageList[index].process = percent;
      } else if (uploadType == UploadType.FeastRemarkDjType) {
        //宴会备注 ---定金
        uploadImageProvider.feastRemarkDjImageList[index].process = percent;
      } else if (uploadType == UploadType.FeastRemarkContractType) {
        //宴会备注 ---合同
        uploadImageProvider.feastRemarkContractImageList[index].process =
            percent;
      } else if (uploadType == UploadType.FeastRemarkInvoiceType) {
        //宴会备注 ---发票
        uploadImageProvider.feastRemarkInvoiceImageList[index].process =
            percent;
      }

      uploadImageProvider.notifyListeners();
    });
    // 添加实际发送进度订阅
    putController.addSendProgressListener((percent) {
      // _onlineCheckEditProvider.imageList[index].process = percent;
      // setState(() {});
      print('${index}实际发送变化:进度:${percent.toStringAsFixed(4)}');
    });
    if (token == null || token == '') {
      await uploadImageProvider.getQiniuInfo(context, {});
    }
    var usedToken = uploadImageProvider.qiniuInfoSunModel.token;
    if (usedToken == null || usedToken == '') {
      print('token 不能为空');
      return;
    }
    print('开始上传文件');
    storage.putFile(
      selectedFile,
      usedToken,
      options: PutOptions(
        key: key,
        partSize: partSize,
        controller: putController,
      ),
    )
      ..then((PutResponse response) {
        print('${index}上传已完成: 原始响应数据: ${jsonEncode(response.rawData)}');
        print('------------------------');
        String imgUrl = uploadImageProvider.qiniuInfoSunModel.domain +
            '/' +
            response.rawData['key'];
        if (uploadType == UploadType.StoreFrontUploadType) {
          //门头
          uploadImageProvider.imageListFront[index].process = 1;
          uploadImageProvider.imageListFront[index].qiniuUrl = imgUrl;
        } else if (uploadType == UploadType.EnvironmentUploadType) {
          uploadImageProvider.imageListDenvironment[index].process = 1;
          uploadImageProvider.imageListDenvironment[index].qiniuUrl = imgUrl;
        } else if (uploadType == UploadType.ConsumptionUploadType) {
          //消费清单
          uploadImageProvider.imageList[index].process = 1;
          uploadImageProvider.imageList[index].qiniuUrl = imgUrl;
        } else if (uploadType == UploadType.TableManagerType) {
          //桌面照片管理
          uploadImageProvider.tableImageList[index].process = 1;
          uploadImageProvider.tableImageList[index].qiniuUrl = imgUrl;
          uploadImageProvider.tableImageList[index].isUpload = false;
          uploadImageProvider.countUpload++;
          if (uploadImageProvider.countUpload == countAll) {
            //所有图片上传完成,可以绑定桌位
            uploadImageProvider.countUpload = 0;
            callback();
          }
        } else if (uploadType == UploadType.FeastRemarkType) {
          //宴会备注---意向
          uploadImageProvider.feastRemarkImageList[index].process = 1;
          uploadImageProvider.feastRemarkImageList[index].qiniuUrl = imgUrl;
        } else if (uploadType == UploadType.FeastRemarkXtType) {
          //宴会备注---选台
          uploadImageProvider.feastRemarkXtImageList[index].process = 1;
          uploadImageProvider.feastRemarkXtImageList[index].qiniuUrl = imgUrl;
        } else if (uploadType == UploadType.FeastRemarkDjType) {
          //宴会备注---定金
          uploadImageProvider.feastRemarkDjImageList[index].process = 1;
          uploadImageProvider.feastRemarkDjImageList[index].qiniuUrl = imgUrl;
        } else if (uploadType == UploadType.FeastRemarkContractType) {
          //宴会备注 ---合同
          uploadImageProvider.feastRemarkContractImageList[index].process = 1;
          uploadImageProvider.feastRemarkContractImageList[index].qiniuUrl =
              imgUrl;
        } else if (uploadType == UploadType.FeastRemarkInvoiceType) {
          //宴会备注 ---发票
          uploadImageProvider.feastRemarkInvoiceImageList[index].process = 1;
          uploadImageProvider.feastRemarkInvoiceImageList[index].qiniuUrl =
              imgUrl;
        }

        // 取消当前任务
        putController.cancel();
        // _image
        uploadImageProvider.notifyListeners();
      })
      ..catchError((dynamic error) {
        if (error is StorageError) {
          switch (error.type) {
            case StorageErrorType.CONNECT_TIMEOUT:
              print('发生错误: 连接超时');
              break;
            case StorageErrorType.SEND_TIMEOUT:
              print('发生错误: 发送数据超时');
              break;
            case StorageErrorType.RECEIVE_TIMEOUT:
              print('发生错误: 响应数据超时');
              break;
            case StorageErrorType.RESPONSE:
              print('发生错误: ${error.message}');
              break;
            case StorageErrorType.CANCEL:
              print('发生错误: 请求取消');
              break;
            case StorageErrorType.UNKNOWN:
              print('发生错误: 未知错误');
              break;
            case StorageErrorType.NO_AVAILABLE_HOST:
              print('发生错误: 无可用 Host');
              break;
            case StorageErrorType.IN_PROGRESS:
              print('发生错误: 已在队列中');
              break;
          }
        } else {
          print('发生错误: ${error.toString()}');
        }

        print('------------------------');
      });
  }

  ///上传到七牛云
  void startUploadOnly(BuildContext context, File selectedFile, int index,
      bool needInit, UploadImageProvider uploadImageProvider) async {
    final PutController putController = PutController();
    print(index);

    // 添加状态监听
    putController.addStatusListener((StorageStatus status) {
      print('状态变化: 当前任务状态:${status.toString()}');
    });
    // 添加整体进度监听
    putController.addProgressListener((percent) {
      print('${index}任务进度变化:进度:${percent.toStringAsFixed(4)}');
      if (index == 0) {
        //0 头像
        uploadImageProvider.touxiang.process = percent;
      } else if (index == 2) {
        //2 门头
        uploadImageProvider.mentou.process = percent;
      } else if (index == 3) {
        //3 菜品
        uploadImageProvider.dish.process = percent;
      } else {
        //1 二维码
        uploadImageProvider.erweima.process = percent;
      }
      uploadImageProvider.notifyListeners();
    });
    // 添加实际发送进度订阅
    putController.addSendProgressListener((percent) {
      // _onlineCheckEditProvider.imageList[index].process = percent;
      // setState(() {});
      print('${index}实际发送变化:进度:${percent.toStringAsFixed(4)}');
    });
    if (token == null || token == '') {
      await uploadImageProvider.getQiniuInfo(context, {});
    }
    var usedToken = uploadImageProvider.qiniuInfoSunModel.token;
    if (usedToken == null || usedToken == '') {
      print('token 不能为空');
      return;
    }
    print('开始上传文件');
    storage.putFile(
      selectedFile,
      usedToken,
      options: PutOptions(
        key: key,
        partSize: partSize,
        controller: putController,
      ),
    )
      ..then((PutResponse response) {
        print('${index}上传已完成: 原始响应数据: ${jsonEncode(response.rawData)}');
        print('------------------------');
        String imgUrl = uploadImageProvider.qiniuInfoSunModel.domain +
            '/' +
            response.rawData['key'];

        // 取消当前任务
        putController.cancel();
        if (index == 0) {
          uploadImageProvider.touxiang.process = 1;
          uploadImageProvider.touxiang.qiniuUrl = imgUrl;
          uploadImageProvider.touxiang.file = null;
          uploadImageProvider.notifyListeners();
        } else if (index == 1) {
          uploadImageProvider.erweima.process = 1;
          uploadImageProvider.erweima.qiniuUrl = imgUrl;
          uploadImageProvider.erweima.file = null;
          uploadImageProvider.notifyListeners();
        } else if (index == 2) {
          uploadImageProvider.mentou.process = 1;
          uploadImageProvider.mentou.qiniuUrl = imgUrl;
          uploadImageProvider.mentou.file = null;
          uploadImageProvider.notifyListeners();
        } else if (index == 3) {
          uploadImageProvider.dish.process = 1;
          uploadImageProvider.dish.qiniuUrl = imgUrl;
          uploadImageProvider.dish.file = null;
          uploadImageProvider.notifyListeners();
        }
      })
      ..catchError((dynamic error) {
        if (error is StorageError) {
          switch (error.type) {
            case StorageErrorType.CONNECT_TIMEOUT:
              print('发生错误: 连接超时');
              break;
            case StorageErrorType.SEND_TIMEOUT:
              print('发生错误: 发送数据超时');
              break;
            case StorageErrorType.RECEIVE_TIMEOUT:
              print('发生错误: 响应数据超时');
              break;
            case StorageErrorType.RESPONSE:
              print('发生错误: ${error.message}');
              break;
            case StorageErrorType.CANCEL:
              print('发生错误: 请求取消');
              break;
            case StorageErrorType.UNKNOWN:
              print('发生错误: 未知错误');
              break;
            case StorageErrorType.NO_AVAILABLE_HOST:
              print('发生错误: 无可用 Host');
              break;
            case StorageErrorType.IN_PROGRESS:
              print('发生错误: 已在队列中');
              break;
          }
        } else {
          print('发生错误: ${error.toString()}');
        }

        print('------------------------');
      });
  }
}