import 'dart:convert'; import 'package:dio/dio.dart'; import 'package:flutter_picgo/api/aliyun_api.dart'; import 'package:flutter_picgo/model/aliyun_config.dart'; import 'package:flutter_picgo/model/uploaded.dart'; import 'package:flutter_picgo/resources/pb_type_keys.dart'; import 'package:flutter_picgo/utils/image_upload.dart'; import 'dart:io'; import 'package:path/path.dart' as path; import 'package:flutter_picgo/utils/strategy/image_upload_strategy.dart'; import 'package:flutter_picgo/utils/strings.dart'; class AliyunImageUpload implements ImageUploadStrategy { @override Future delete(Uploaded uploaded) async { String infoStr = await ImageUploadUtils.getUploadedItemInfo(uploaded.id); AliyunUploadedInfo info; try { info = AliyunUploadedInfo.fromJson(json.decode(infoStr)); } catch (e) {} if (info != null) { String auth = AliyunApi.buildSignature(info.accessKeyId, info.accessKeySecret, 'delete', info.bucket, info.object); await AliyunApi.deleteObject(info.bucket, info.area, info.object, auth); } return uploaded; } @override Future upload(File file, String renameImage) async { String configStr = await ImageUploadUtils.getPBConfig(PBTypeKeys.aliyun); print(configStr); if (isBlank(configStr)) { throw AliyunError(error: '读取配置文件错误!请重试'); } AliyunConfig config = AliyunConfig.fromJson(json.decode(configStr)); String objectPath = isBlank(config.path) ? renameImage : path.joinAll([config.path, renameImage]); String policy = AliyunApi.buildEncodePolicy(objectPath); await AliyunApi.postObject( config.bucket, config.area, FormData.fromMap({ 'key': objectPath, 'OSSAccessKeyId': config.accessKeyId, 'policy': policy, 'Signature': AliyunApi.buildPostSignature( config.accessKeyId, config.accessKeySecret, policy), 'file': await MultipartFile.fromFile(file.path, filename: renameImage) })); String imgPath = path.joinAll([ isBlank(config.customUrl) ? 'https://${config.bucket}.${config.area}.aliyuncs.com' : config.customUrl, objectPath ]); var uploadedItem = Uploaded( -1, '$imgPath${config.options ?? ''}', PBTypeKeys.aliyun, info: json.encode(AliyunUploadedInfo( accessKeyId: config.accessKeyId, accessKeySecret: config.accessKeySecret, area: config.area, bucket: config.bucket, object: objectPath))); await ImageUploadUtils.saveUploadedItem(uploadedItem); return uploadedItem; } } class AliyunError implements Exception { AliyunError({ this.error, }); dynamic error; String get message => (error?.toString() ?? ''); @override String toString() { var msg = 'AliyunError $message'; if (error is Error) { msg += '\n${error.stackTrace}'; } return msg; } } class AliyunUploadedInfo { String accessKeyId; String accessKeySecret; String area; String bucket; String object; AliyunUploadedInfo( {this.accessKeyId, this.accessKeySecret, this.area, this.bucket, this.object}); AliyunUploadedInfo.fromJson(Map json) { accessKeyId = json['accessKeyId']; accessKeySecret = json['accessKeySecret']; area = json['area']; bucket = json['bucket']; object = json['object']; } Map toJson() { final Map data = new Map(); data['accessKeyId'] = this.accessKeyId; data['accessKeySecret'] = this.accessKeySecret; data['area'] = this.area; data['bucket'] = this.bucket; data['object'] = this.object; return data; } }