From 5b62f89531dbc09e6952ff68cb8daf589d3160ad Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Sun, 28 Sep 2025 01:53:55 +0800 Subject: [PATCH] :bug: Fix web file upload --- lib/main.dart | 12 ++++- lib/pods/network.dart | 1 + lib/services/file.dart | 89 +++++++++------------------------ lib/services/file_uploader.dart | 8 +-- 4 files changed, 39 insertions(+), 71 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 46c4c372..3ec94f71 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -147,7 +147,17 @@ void main() async { runApp( ProviderScope( - observers: [TalkerRiverpodObserver(talker: talker)], + observers: [ + TalkerRiverpodObserver( + talker: talker, + settings: TalkerRiverpodLoggerSettings( + printProviderAdded: false, + printProviderDisposed: false, + printProviderUpdated: false, + printStateFullData: false, + ), + ), + ], overrides: [sharedPreferencesProvider.overrideWithValue(prefs)], child: Directionality( textDirection: TextDirection.ltr, diff --git a/lib/pods/network.dart b/lib/pods/network.dart index 2d348992..18667f76 100644 --- a/lib/pods/network.dart +++ b/lib/pods/network.dart @@ -106,6 +106,7 @@ final apiClientProvider = Provider((ref) { printResponseHeaders: false, printResponseMessage: false, printRequestData: false, + printResponseData: false, ), ), ]); diff --git a/lib/services/file.dart b/lib/services/file.dart index 1b240c1d..78469ec8 100644 --- a/lib/services/file.dart +++ b/lib/services/file.dart @@ -1,5 +1,4 @@ import 'dart:async'; -import 'dart:io'; import 'dart:ui'; import 'package:croppy/croppy.dart'; import 'package:cross_file/cross_file.dart'; @@ -9,7 +8,6 @@ import 'package:flutter/widgets.dart'; import 'package:island/models/file.dart'; import 'package:island/services/file_uploader.dart'; import 'package:native_exif/native_exif.dart'; -import 'package:path_provider/path_provider.dart'; enum FileUploadMode { generic, mediaSafe } @@ -21,8 +19,7 @@ Future cropImage( }) async { final result = await showMaterialImageCropper( context, - imageProvider: - kIsWeb ? NetworkImage(image.path) : FileImage(File(image.path)), + imageProvider: MemoryImage(await image.readAsBytes()), showLoadingIndicatorOnSubmit: true, allowedAspectRatios: allowedAspectRatios, ); @@ -64,7 +61,10 @@ Completer putFileToCloud({ fileData.isOnDevice && fileData.type == UniversalFileType.image) { final data = fileData.data; - if (data is XFile && !kIsWeb && (Platform.isIOS || Platform.isAndroid)) { + if (data is XFile && + !kIsWeb && + (defaultTargetPlatform == TargetPlatform.iOS || + defaultTargetPlatform == TargetPlatform.android)) { Exif.fromPath(data.path) .then((exif) async { final gpsAttributes = { @@ -184,67 +184,24 @@ Completer _processUpload( final uploader = FileUploader(dio); - // Get File object - File fileObj; - if (file.path.isNotEmpty) { - fileObj = File(file.path); - // Call progress start - onProgress?.call(0.0, Duration.zero); - uploader - .uploadFile( - file: fileObj, - fileName: actualFilename, - contentType: actualMimetype, - poolId: poolId, - ) - .then((result) { - // Call progress end - onProgress?.call(1.0, Duration.zero); - completer.complete(result); - }) - .catchError((e) { - completer.completeError(e); - throw e; - }); - } else { - // Write to temp file - getTemporaryDirectory() - .then((tempDir) { - final tempFile = File('${tempDir.path}/temp_upload_$actualFilename'); - file - .readAsBytes() - .then((bytes) => tempFile.writeAsBytes(bytes)) - .then((_) { - fileObj = tempFile; - // Call progress start - onProgress?.call(0.0, Duration.zero); - uploader - .uploadFile( - file: fileObj, - fileName: actualFilename, - contentType: actualMimetype, - poolId: poolId, - ) - .then((result) { - // Call progress end - onProgress?.call(1.0, Duration.zero); - completer.complete(result); - }) - .catchError((e) { - completer.completeError(e); - throw e; - }); - }) - .catchError((e) { - completer.completeError(e); - throw e; - }); - }) - .catchError((e) { - completer.completeError(e); - throw e; - }); - } + // Call progress start + onProgress?.call(0.0, Duration.zero); + uploader + .uploadFile( + file: file, + fileName: actualFilename, + contentType: actualMimetype, + poolId: poolId, + ) + .then((result) { + // Call progress end + onProgress?.call(1.0, Duration.zero); + completer.complete(result); + }) + .catchError((e) { + completer.completeError(e); + throw e; + }); return completer; } diff --git a/lib/services/file_uploader.dart b/lib/services/file_uploader.dart index 4da0e168..0c5aa2a3 100644 --- a/lib/services/file_uploader.dart +++ b/lib/services/file_uploader.dart @@ -1,7 +1,7 @@ import 'dart:async'; -import 'dart:io'; import 'dart:typed_data'; +import 'package:cross_file/cross_file.dart'; import 'package:crypto/crypto.dart'; import 'package:dio/dio.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; @@ -14,7 +14,7 @@ class FileUploader { FileUploader(this._dio); /// Calculates the MD5 hash of a file. - Future _calculateFileHash(File file) async { + Future _calculateFileHash(XFile file) async { final bytes = await file.readAsBytes(); final digest = md5.convert(bytes); return digest.toString(); @@ -22,7 +22,7 @@ class FileUploader { /// Creates an upload task for the given file. Future> createUploadTask({ - required File file, + required XFile file, required String fileName, required String contentType, String? poolId, @@ -80,7 +80,7 @@ class FileUploader { /// Uploads a file in chunks using the multi-part API. Future uploadFile({ - required File file, + required XFile file, required String fileName, required String contentType, String? poolId,