circle_app/circle_app/lib/util/qiniu.dart
2023-07-04 15:34:19 +08:00

85 lines
2.6 KiB
Dart

import 'dart:convert';
import 'dart:io';
import 'dart:math';
import 'package:circle_app/util/util.dart';
import 'package:flutter_luban/flutter_luban.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:image_picker/image_picker.dart';
import 'package:qiniu_flutter_sdk/qiniu_flutter_sdk.dart';
import 'package:intl/intl.dart';
import '../common/config.dart';
import '../network/api.dart';
import '../network/dio_manager.dart';
typedef void MyCallback(String result);
//上传七牛云
void updataQiniu(String filePath,String name,String path ,String quToken,MyCallback myCallback) {
var storage = Storage();
DateTime now = DateTime.now();
String yearMonth = DateFormat('yyyyMM').format(now);
String imgPath = path +yearMonth+"/"+generateRandomString(16)+ name;
PutController putController = PutController();
putController.addStatusListener((StorageStatus status) {
if (status == StorageStatus.Success) {
var headUrl = CONFIG.IMAGE_HEAD + imgPath;
myCallback(headUrl);
}
print('状态变化: 当前任务状态:$status');
});
putController.addProgressListener((double status) {
print('上传进度: $status');
});
storage.putFile(File(filePath), quToken,
options: PutOptions(controller: putController, key: imgPath));
}
//封装上传图片
void upDataImage(String quToken ,XFile pickedFile,String updataRoute,MyCallback myCallback) async{
// print(quToken);
if(quToken.isEmpty){
var data =
await DioManager.instance.get(url: Api.getqiniuToken, params: {});
var bean = BaseResponse<QnTokenData>.fromJson(
data, (data) => QnTokenData.fromJson(data));
if(bean.isSuccess()){
quToken = bean.data!.token.toString();
}else{
showToast("图片上传失败");
SmartDialog.dismiss(force: true);
return;
}
}
var path = await getApplicationSupportDirectoryPath();
CompressObject compressObject = CompressObject(
imageFile:File(pickedFile.path), //image
path:path, //compress to path
quality: 80,//first compress quality, default 80
step: 9,//compress quality step, The bigger the fast, Smaller is more accurate, default 6
mode: CompressMode.LARGE2SMALL,//default AUTO
);
Luban.compressImage(compressObject).then((_path) {
updataQiniu(_path.toString(),pickedFile.name,updataRoute,quToken,(result){
myCallback(result);
});
});
}
String generateRandomString(int length) {
var random = Random.secure();
var values = List<int>.generate(length, (index) => random.nextInt(256));
var randomString = base64Url.encode(values);
return randomString.substring(0, length);
}