fix:优化图片上传组件,解决png图片报错问题

This commit is contained in:
2026-05-12 11:35:21 +08:00
parent aa47bc97d5
commit 1c971fb0b2
7 changed files with 417 additions and 278 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
+6
View File
@@ -63,6 +63,12 @@
<excludeFolder url="file://$MODULE_DIR$/example/linux/flutter/ephemeral/.plugin_symlinks/volume_controller/example/.dart_tool" /> <excludeFolder url="file://$MODULE_DIR$/example/linux/flutter/ephemeral/.plugin_symlinks/volume_controller/example/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/example/linux/flutter/ephemeral/.plugin_symlinks/volume_controller/example/.pub" /> <excludeFolder url="file://$MODULE_DIR$/example/linux/flutter/ephemeral/.plugin_symlinks/volume_controller/example/.pub" />
<excludeFolder url="file://$MODULE_DIR$/example/linux/flutter/ephemeral/.plugin_symlinks/volume_controller/example/build" /> <excludeFolder url="file://$MODULE_DIR$/example/linux/flutter/ephemeral/.plugin_symlinks/volume_controller/example/build" />
<excludeFolder url="file://$MODULE_DIR$/example/linux/flutter/ephemeral/.plugin_symlinks/jni/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/example/linux/flutter/ephemeral/.plugin_symlinks/jni/.pub" />
<excludeFolder url="file://$MODULE_DIR$/example/linux/flutter/ephemeral/.plugin_symlinks/jni/build" />
<excludeFolder url="file://$MODULE_DIR$/example/linux/flutter/ephemeral/.plugin_symlinks/jni/example/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/example/linux/flutter/ephemeral/.plugin_symlinks/jni/example/.pub" />
<excludeFolder url="file://$MODULE_DIR$/example/linux/flutter/ephemeral/.plugin_symlinks/jni/example/build" />
</content> </content>
<orderEntry type="inheritedJdk" /> <orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />
+8 -8
View File
@@ -271,7 +271,7 @@
<entry key="flutter"> <entry key="flutter">
<value> <value>
<list> <list>
<option value="$USER_HOME$/flutter/packages/flutter/lib" /> <option value="$PROJECT_DIR$/../../flutter/packages/flutter/lib" />
</list> </list>
</value> </value>
</entry> </entry>
@@ -425,14 +425,14 @@
<entry key="flutter_test"> <entry key="flutter_test">
<value> <value>
<list> <list>
<option value="$USER_HOME$/flutter/packages/flutter_test/lib" /> <option value="$PROJECT_DIR$/../../flutter/packages/flutter_test/lib" />
</list> </list>
</value> </value>
</entry> </entry>
<entry key="flutter_web_plugins"> <entry key="flutter_web_plugins">
<value> <value>
<list> <list>
<option value="$USER_HOME$/flutter/packages/flutter_web_plugins/lib" /> <option value="$PROJECT_DIR$/../../flutter/packages/flutter_web_plugins/lib" />
</list> </list>
</value> </value>
</entry> </entry>
@@ -1020,7 +1020,7 @@
<entry key="sky_engine"> <entry key="sky_engine">
<value> <value>
<list> <list>
<option value="$USER_HOME$/flutter/bin/cache/pkg/sky_engine/lib" /> <option value="$PROJECT_DIR$/../../flutter/bin/cache/pkg/sky_engine/lib" />
</list> </list>
</value> </value>
</entry> </entry>
@@ -1513,10 +1513,10 @@
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/xdg_directories-1.1.0/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/xdg_directories-1.1.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/xml-6.6.1/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/xml-6.6.1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/yaml-3.1.3/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/yaml-3.1.3/lib" />
<root url="file://$USER_HOME$/flutter/bin/cache/pkg/sky_engine/lib" /> <root url="file://$PROJECT_DIR$/../../flutter/bin/cache/pkg/sky_engine/lib" />
<root url="file://$USER_HOME$/flutter/packages/flutter/lib" /> <root url="file://$PROJECT_DIR$/../../flutter/packages/flutter/lib" />
<root url="file://$USER_HOME$/flutter/packages/flutter_test/lib" /> <root url="file://$PROJECT_DIR$/../../flutter/packages/flutter_test/lib" />
<root url="file://$USER_HOME$/flutter/packages/flutter_web_plugins/lib" /> <root url="file://$PROJECT_DIR$/../../flutter/packages/flutter_web_plugins/lib" />
</CLASSES> </CLASSES>
<JAVADOC /> <JAVADOC />
<SOURCES /> <SOURCES />
+53 -53
View File
@@ -1,62 +1,62 @@
<component name="libraryTable"> <component name="libraryTable">
<library name="Flutter Plugins" type="FlutterPluginsLibraryType"> <library name="Flutter Plugins" type="FlutterPluginsLibraryType">
<CLASSES> <CLASSES>
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_gallery_saver_plus-4.0.1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_linux-3.2.2" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/path_provider_windows-2.3.0" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/path_provider_foundation-2.6.0" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker_linux-0.2.2" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/shared_preferences_windows-2.4.1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_inappwebview_windows-0.6.0" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/video_player_web-2.4.0" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness-2.1.7" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/device_info_plus-11.5.0" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker-1.2.1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker_for_web-3.1.1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/permission_handler-11.4.0" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_inappwebview-6.1.5" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/file_selector_linux-0.9.4" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_inappwebview_android-1.1.3" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_windows-3.1.5" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/sqflite-2.4.2" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/path_provider-2.1.5" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/file_selector_windows-0.9.3+5" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/shared_preferences_web-2.4.3" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_macos-3.2.5" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_web-2.4.2" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker_windows-0.2.2" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/shared_preferences_foundation-2.5.6" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher-6.3.2" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_inappwebview_web-1.1.2" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/path_provider_linux-2.2.1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/permission_handler_html-0.1.3+5" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_inappwebview_macos-1.1.2" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker_macos-0.2.2+1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/file_selector_macos-0.9.5" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/sqflite_darwin-2.4.2" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_inappwebview_ios-1.1.2" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/shared_preferences_linux-2.4.1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker_android-0.8.13+16" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker_android-0.8.13+16" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/shared_preferences-2.5.5" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/screen_brightness-2.1.7" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_android-6.3.29" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_image_compress_web-0.1.5" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_ios-6.4.1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_image_compress_macos-1.0.3" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/sqflite_android-2.4.2+3" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/video_player-2.11.1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_image_compress_common-1.0.6" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/path_provider_android-2.3.1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/video_player_avfoundation-2.9.4" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_image_compress_ohos-0.0.3" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_image_compress_ohos-0.0.3" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/video_player_android-2.9.5" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/path_provider_android-2.3.1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/jni_flutter-1.0.1" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/video_player_web-2.4.0" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/package_info_plus-9.0.1" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/file_selector_macos-0.9.5" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/photo_manager-3.9.0" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_inappwebview-6.1.5" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/shared_preferences_android-2.4.23" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_inappwebview_ios-1.1.2" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/jni-1.0.0" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_image_compress_web-0.1.5" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_image_compress-2.4.0" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_web-2.4.2" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker_ios-0.8.13+6" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/wakelock_plus-1.5.2" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/wakelock_plus-1.5.2" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/package_info_plus-9.0.1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_linux-3.2.2" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/file_selector_windows-0.9.3+5" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_image_compress_common-1.0.6" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/device_info_plus-11.5.0" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker_linux-0.2.2" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker_ios-0.8.13+6" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/photo_manager-3.9.0" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/path_provider_windows-2.3.0" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_inappwebview_macos-1.1.2" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/shared_preferences_foundation-2.5.6" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_inappwebview_android-1.1.3" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_inappwebview_web-1.1.2" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/video_player-2.11.1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_macos-3.2.5" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/shared_preferences_android-2.4.23" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/path_provider-2.1.5" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker_windows-0.2.2" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/path_provider_foundation-2.6.0" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_gallery_saver_plus-4.0.1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/permission_handler_html-0.1.3+5" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker_for_web-3.1.1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher-6.3.2" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/shared_preferences_windows-2.4.1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_windows-3.1.5" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_image_compress_macos-1.0.3" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/shared_preferences_web-2.4.3" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker_macos-0.2.2+1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/shared_preferences_linux-2.4.1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/sqflite-2.4.2" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/jni-1.0.0" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_ios-6.4.1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/shared_preferences-2.5.5" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/sqflite_android-2.4.2+3" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/image_picker-1.2.1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/path_provider_linux-2.2.1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/url_launcher_android-6.3.29" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/video_player_avfoundation-2.9.4" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/jni_flutter-1.0.1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/permission_handler-11.4.0" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/file_selector_linux-0.9.4" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_inappwebview_windows-0.6.0" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/flutter_image_compress-2.4.0" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/sqflite_darwin-2.4.2" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.flutter-io.cn/video_player_android-2.9.5" />
</CLASSES> </CLASSES>
<JAVADOC /> <JAVADOC />
<SOURCES /> <SOURCES />
+19 -6
View File
@@ -37,8 +37,15 @@ class UploadOss {
required String ossHost, required String ossHost,
bool? isShowLoading, bool? isShowLoading,
}) async { }) async {
final String normalizedFileType =
fileType.toLowerCase() == 'jpeg' ? 'jpg' : fileType.toLowerCase();
final bool isVideo = normalizedFileType == 'mp4';
final String? imageContentType = isVideo
? null
: (normalizedFileType == 'jpg' ? 'jpeg' : normalizedFileType);
// 生成oss的路径和文件名我这里目前设置的是moment/20201229/test.mp4 // 生成oss的路径和文件名我这里目前设置的是moment/20201229/test.mp4
String pathName = "$rootDir/${getDate()}/app-${getRandom(12)}.$fileType"; String pathName =
"$rootDir/${getDate()}/app-${getRandom(12)}.$normalizedFileType";
// 请求参数的form对象 // 请求参数的form对象
FormData formdata = FormData.fromMap({ FormData formdata = FormData.fromMap({
@@ -51,8 +58,8 @@ class UploadOss {
'success_action_status': '200', 'success_action_status': '200',
'file': MultipartFile.fromFileSync( 'file': MultipartFile.fromFileSync(
path, path,
contentType: fileType == 'mp4' ? null : DioMediaType("image", "jpg"), contentType: isVideo ? null : DioMediaType("image", imageContentType!),
filename: "${getRandom(12)}.$fileType", filename: "${getRandom(12)}.$normalizedFileType",
), ),
}); });
if (isShowLoading == true) { if (isShowLoading == true) {
@@ -71,13 +78,19 @@ class UploadOss {
ossHost, ossHost,
data: formdata, data: formdata,
options: Options( options: Options(
contentType: "multipart/form-data;image/jpg", contentType: isVideo
headers: {'Content-Type': 'multipart/form-data;image/jpg'}, ? "multipart/form-data"
: "multipart/form-data;image/$imageContentType",
headers: {
'Content-Type': isVideo
? "multipart/form-data"
: "multipart/form-data;image/$imageContentType",
},
), ),
); );
print("response ===== $response"); print("response ===== $response");
EasyLoading.dismiss(); EasyLoading.dismiss();
if(fileType == 'jpg'){ if (!isVideo && path.contains('compressed_images_')) {
/// 删除临时文件 /// 删除临时文件
File(path).deleteSync(); File(path).deleteSync();
} }
+137 -17
View File
@@ -1,5 +1,4 @@
import 'dart:io'; import 'dart:io';
import 'dart:math';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter_common/upload_image/ossUtil.dart'; import 'package:flutter_common/upload_image/ossUtil.dart';
@@ -12,6 +11,28 @@ import 'package:image_picker/image_picker.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
import 'package:wechat_assets_picker/wechat_assets_picker.dart'; import 'package:wechat_assets_picker/wechat_assets_picker.dart';
class _CompressedImageFile {
const _CompressedImageFile({
required this.path,
required this.fileType,
});
final String path;
final String fileType;
}
class _ImageCompressionTarget {
const _ImageCompressionTarget({
required this.format,
required this.extension,
required this.fileType,
});
final CompressFormat format;
final String extension;
final String fileType;
}
class UploadImagesTool { class UploadImagesTool {
static uploadImagesTool({ static uploadImagesTool({
String? oSSAccessKeyId, String? oSSAccessKeyId,
@@ -139,7 +160,9 @@ class UploadImagesTool {
) )
: CupertinoActionSheet( : CupertinoActionSheet(
title: const Text('上传图片'), title: const Text('上传图片'),
message: (max == null || max == 0) ? null : Text('请选择上传方式\n相册最多${max}'), message: (max == null || max == 0)
? null
: Text('请选择上传方式\n相册最多$max张'),
actions: isAddOtherWidget != null actions: isAddOtherWidget != null
? <Widget>[ ? <Widget>[
isAddOtherWidget, isAddOtherWidget,
@@ -153,7 +176,8 @@ class UploadImagesTool {
policy: policy ?? '', policy: policy ?? '',
callback: callback ?? '', callback: callback ?? '',
signature: signature ?? '', signature: signature ?? '',
chooseImages: (list) => chooseImages?.call(list), chooseImages: (list) =>
chooseImages?.call(list),
); );
Get.back(); Get.back();
}, },
@@ -169,7 +193,8 @@ class UploadImagesTool {
policy: policy ?? '', policy: policy ?? '',
callback: callback ?? '', callback: callback ?? '',
signature: signature ?? '', signature: signature ?? '',
chooseImages: (list) => chooseImages?.call(list), chooseImages: (list) =>
chooseImages?.call(list),
); );
Get.back(); Get.back();
}, },
@@ -186,7 +211,8 @@ class UploadImagesTool {
policy: policy ?? '', policy: policy ?? '',
callback: callback ?? '', callback: callback ?? '',
signature: signature ?? '', signature: signature ?? '',
chooseImages: (list) => chooseImages?.call(list), chooseImages: (list) =>
chooseImages?.call(list),
); );
Get.back(); Get.back();
}, },
@@ -203,7 +229,8 @@ class UploadImagesTool {
callback: callback ?? '', callback: callback ?? '',
signature: signature ?? '', signature: signature ?? '',
isShowLoading: isShowLoading, isShowLoading: isShowLoading,
chooseImages: (list) => chooseImages?.call(list), chooseImages: (list) =>
chooseImages?.call(list),
); );
Get.back(); Get.back();
}, },
@@ -234,8 +261,7 @@ class UploadImagesTool {
source: ImageSource.camera, source: ImageSource.camera,
maxHeight: 1080, maxHeight: 1080,
maxWidth: 1920, maxWidth: 1920,
imageQuality: 80 imageQuality: 80);
);
if (file == null) { if (file == null) {
Get.back(); Get.back();
} else { } else {
@@ -267,7 +293,8 @@ class UploadImagesTool {
if (isVideo == true) { if (isVideo == true) {
final List<AssetEntity>? result = await AssetPicker.pickAssets( final List<AssetEntity>? result = await AssetPicker.pickAssets(
Get.context!, Get.context!,
pickerConfig: AssetPickerConfig(maxAssets: 1, requestType: RequestType.video), pickerConfig:
AssetPickerConfig(maxAssets: 1, requestType: RequestType.video),
); );
final File? video = await result?.first.file; final File? video = await result?.first.file;
String path = await saveNetworkImgGallery( String path = await saveNetworkImgGallery(
@@ -283,34 +310,34 @@ class UploadImagesTool {
chooseImages?.call([path]); chooseImages?.call([path]);
} else { } else {
/// 创建临时目录 /// 创建临时目录
final Directory tempDir = Directory.systemTemp.createTempSync('compressed_images_'); final Directory tempDir =
Directory.systemTemp.createTempSync('compressed_images_');
final List<AssetEntity>? result = await AssetPicker.pickAssets( final List<AssetEntity>? result = await AssetPicker.pickAssets(
Get.context!, Get.context!,
pickerConfig: AssetPickerConfig(maxAssets: max ?? 50), pickerConfig: AssetPickerConfig(maxAssets: max ?? 50),
); );
/// 临时存储选中的图片 /// 临时存储选中的图片
final List<XFile> selectedFiles = []; final List<_CompressedImageFile> selectedFiles = [];
if (result != null && result.isNotEmpty) { if (result != null && result.isNotEmpty) {
for (int i = 0; i < result.length; i++) { for (int i = 0; i < result.length; i++) {
final File? file = await result[i].file; final File? file = await result[i].file;
if (file != null) { if (file != null) {
/// 获取文件扩展名 final _CompressedImageFile? compressedFile =
final String extension = file.absolute.path.split('.').last; await _compressGalleryImage(file, tempDir);
/// 压缩并保存到临时文件
final XFile? compressedFile = await FlutterImageCompress.compressAndGetFile(
file.absolute.path, '${tempDir.path}/${DateTime.now().millisecondsSinceEpoch}_compressed.$extension',
quality: 80, minWidth: 1920, minHeight: 1080);
if (compressedFile != null) { if (compressedFile != null) {
selectedFiles.add(compressedFile); selectedFiles.add(compressedFile);
} }
} }
} }
} }
/// 上传选中的图片 /// 上传选中的图片
List<String> list = []; List<String> list = [];
for (var element in selectedFiles) { for (var element in selectedFiles) {
String path = await saveNetworkImgGallery( String path = await saveNetworkImgGallery(
element.path, element.path,
fileType: element.fileType,
oSSAccessKeyId: oSSAccessKeyId ?? '', oSSAccessKeyId: oSSAccessKeyId ?? '',
ossHost: ossHost ?? '', ossHost: ossHost ?? '',
ossDirectory: ossDirectory ?? '', ossDirectory: ossDirectory ?? '',
@@ -325,6 +352,99 @@ class UploadImagesTool {
} }
} }
static Future<_CompressedImageFile?> _compressGalleryImage(
File file,
Directory tempDir,
) async {
final _ImageCompressionTarget target =
_compressionTargetForPath(file.absolute.path);
final XFile? compressedFile = await _compressImageWithTarget(
file,
tempDir,
target,
);
if (compressedFile != null) {
return _CompressedImageFile(
path: compressedFile.path,
fileType: target.fileType,
);
}
if (target.format == CompressFormat.jpeg) {
return null;
}
const _ImageCompressionTarget fallbackTarget = _ImageCompressionTarget(
format: CompressFormat.jpeg,
extension: 'jpg',
fileType: 'jpg',
);
final XFile? fallbackFile = await _compressImageWithTarget(
file,
tempDir,
fallbackTarget,
);
if (fallbackFile == null) {
return null;
}
return _CompressedImageFile(
path: fallbackFile.path,
fileType: fallbackTarget.fileType,
);
}
static Future<XFile?> _compressImageWithTarget(
File file,
Directory tempDir,
_ImageCompressionTarget target,
) async {
try {
return await FlutterImageCompress.compressAndGetFile(
file.absolute.path,
'${tempDir.path}/${DateTime.now().microsecondsSinceEpoch}_compressed.${target.extension}',
quality: 80,
minWidth: 1920,
minHeight: 1080,
format: target.format,
);
} catch (_) {
return null;
}
}
static _ImageCompressionTarget _compressionTargetForPath(String path) {
final String extension =
path.split('?').first.split('.').last.toLowerCase();
switch (extension) {
case 'png':
return const _ImageCompressionTarget(
format: CompressFormat.png,
extension: 'png',
fileType: 'png',
);
case 'webp':
return const _ImageCompressionTarget(
format: CompressFormat.webp,
extension: 'webp',
fileType: 'webp',
);
case 'heic':
case 'heif':
return const _ImageCompressionTarget(
format: CompressFormat.heic,
extension: 'heic',
fileType: 'heic',
);
case 'jpeg':
case 'jpg':
default:
return const _ImageCompressionTarget(
format: CompressFormat.jpeg,
extension: 'jpg',
fileType: 'jpg',
);
}
}
// 保存网络图片 // 保存网络图片
static Future<String> saveNetworkImg( static Future<String> saveNetworkImg(
XFile file, { XFile file, {