TF-2129 Fix cannot attach file on mobile
(cherry picked from commit b35f09069d5ac9379632f599419af0cda1d91cc7)
This commit is contained in:
@@ -1,25 +1,28 @@
|
|||||||
|
|
||||||
import 'package:core/data/network/dio_client.dart';
|
import 'package:core/data/network/dio_client.dart';
|
||||||
import 'package:dio/dio.dart';
|
|
||||||
import 'package:equatable/equatable.dart';
|
import 'package:equatable/equatable.dart';
|
||||||
import 'package:model/upload/file_info.dart';
|
import 'package:tmail_ui_user/features/upload/domain/model/mobile_file_upload.dart';
|
||||||
import 'package:tmail_ui_user/features/upload/domain/model/upload_task_id.dart';
|
import 'package:tmail_ui_user/features/upload/domain/model/upload_task_id.dart';
|
||||||
|
|
||||||
class UploadFileArguments with EquatableMixin {
|
class UploadFileArguments with EquatableMixin {
|
||||||
|
|
||||||
final DioClient dioClient;
|
final DioClient dioClient;
|
||||||
final UploadTaskId uploadId;
|
final UploadTaskId uploadId;
|
||||||
final FileInfo fileInfo;
|
final MobileFileUpload mobileFileUpload;
|
||||||
final Uri uploadUri;
|
final Uri uploadUri;
|
||||||
final CancelToken? cancelToken;
|
|
||||||
|
|
||||||
UploadFileArguments(
|
UploadFileArguments(
|
||||||
this.dioClient,
|
this.dioClient,
|
||||||
this.uploadId,
|
this.uploadId,
|
||||||
this.fileInfo,
|
this.mobileFileUpload,
|
||||||
this.uploadUri,
|
this.uploadUri
|
||||||
{this.cancelToken});
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object?> get props => [uploadId, fileInfo, uploadUri];
|
List<Object?> get props => [
|
||||||
|
dioClient,
|
||||||
|
uploadId,
|
||||||
|
mobileFileUpload,
|
||||||
|
uploadUri
|
||||||
|
];
|
||||||
}
|
}
|
||||||
@@ -15,6 +15,7 @@ import 'package:model/upload/file_info.dart';
|
|||||||
import 'package:model/upload/upload_response.dart';
|
import 'package:model/upload/upload_response.dart';
|
||||||
import 'package:tmail_ui_user/features/upload/data/model/upload_file_arguments.dart';
|
import 'package:tmail_ui_user/features/upload/data/model/upload_file_arguments.dart';
|
||||||
import 'package:tmail_ui_user/features/upload/domain/exceptions/upload_exception.dart';
|
import 'package:tmail_ui_user/features/upload/domain/exceptions/upload_exception.dart';
|
||||||
|
import 'package:tmail_ui_user/features/upload/domain/extensions/file_info_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/upload/domain/model/upload_task_id.dart';
|
import 'package:tmail_ui_user/features/upload/domain/model/upload_task_id.dart';
|
||||||
import 'package:tmail_ui_user/features/upload/domain/state/attachment_upload_state.dart';
|
import 'package:tmail_ui_user/features/upload/domain/state/attachment_upload_state.dart';
|
||||||
import 'package:worker_manager/worker_manager.dart' as worker;
|
import 'package:worker_manager/worker_manager.dart' as worker;
|
||||||
@@ -41,13 +42,13 @@ class FileUploader {
|
|||||||
uploadUri,
|
uploadUri,
|
||||||
cancelToken: cancelToken);
|
cancelToken: cancelToken);
|
||||||
} else {
|
} else {
|
||||||
|
final mobileFileUpload = fileInfo.toMobileFileUpload();
|
||||||
return await _isolateExecutor.execute(
|
return await _isolateExecutor.execute(
|
||||||
arg1: UploadFileArguments(
|
arg1: UploadFileArguments(
|
||||||
_dioClient,
|
_dioClient,
|
||||||
uploadId,
|
uploadId,
|
||||||
fileInfo,
|
mobileFileUpload,
|
||||||
uploadUri,
|
uploadUri
|
||||||
cancelToken: cancelToken
|
|
||||||
),
|
),
|
||||||
fun1: _handleUploadAttachmentAction,
|
fun1: _handleUploadAttachmentAction,
|
||||||
notification: (value) {
|
notification: (value) {
|
||||||
@@ -66,34 +67,31 @@ class FileUploader {
|
|||||||
UploadFileArguments argsUpload,
|
UploadFileArguments argsUpload,
|
||||||
worker.TypeSendPort sendPort
|
worker.TypeSendPort sendPort
|
||||||
) async {
|
) async {
|
||||||
final dioClient = argsUpload.dioClient;
|
final headerParam = argsUpload.dioClient.getHeaders();
|
||||||
final fileInfo = argsUpload.fileInfo;
|
headerParam[HttpHeaders.contentTypeHeader] = argsUpload.mobileFileUpload.mimeType;
|
||||||
final uploadUri = argsUpload.uploadUri;
|
headerParam[HttpHeaders.contentLengthHeader] = argsUpload.mobileFileUpload.fileSize;
|
||||||
final cancelToken = argsUpload.cancelToken;
|
final data = File(argsUpload.mobileFileUpload.filePath).openRead();
|
||||||
|
|
||||||
final resultJson = await _invokeRequestToServer(
|
final resultJson = await argsUpload.dioClient.post(
|
||||||
dioClient,
|
Uri.decodeFull(argsUpload.uploadUri.toString()),
|
||||||
uploadUri,
|
options: Options(headers: headerParam),
|
||||||
fileInfo,
|
data: data,
|
||||||
cancelToken: cancelToken,
|
|
||||||
onSendProgress: (count, total) {
|
onSendProgress: (count, total) {
|
||||||
log('FileUploader::_handleUploadAttachmentAction():onSendProgress: [${argsUpload.uploadId.id}] = $count');
|
log('FileUploader::_handleUploadAttachmentAction():onSendProgress: [${argsUpload.uploadId.id}] = $count');
|
||||||
sendPort.send(
|
sendPort.send(
|
||||||
UploadingAttachmentUploadState(
|
UploadingAttachmentUploadState(
|
||||||
argsUpload.uploadId,
|
argsUpload.uploadId,
|
||||||
count,
|
count,
|
||||||
fileInfo.fileSize
|
argsUpload.mobileFileUpload.fileSize
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
log('FileUploader::_handleUploadAttachmentAction():resultJson: $resultJson');
|
log('FileUploader::_handleUploadAttachmentAction():resultJson: $resultJson');
|
||||||
if (cancelToken?.isCancelled == true) {
|
return _parsingResponse(
|
||||||
log('FileUploader::_handleUploadAttachmentAction(): upload is cancelled');
|
resultJson: resultJson,
|
||||||
return null;
|
fileName: argsUpload.mobileFileUpload.fileName
|
||||||
}
|
);
|
||||||
|
|
||||||
return _parsingResponse(resultJson: resultJson, fileName: fileInfo.fileName);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<Attachment?> _handleUploadAttachmentActionOnWeb(
|
Future<Attachment?> _handleUploadAttachmentActionOnWeb(
|
||||||
@@ -103,10 +101,15 @@ class FileUploader {
|
|||||||
Uri uploadUri,
|
Uri uploadUri,
|
||||||
{CancelToken? cancelToken}
|
{CancelToken? cancelToken}
|
||||||
) async {
|
) async {
|
||||||
final resultJson = await _invokeRequestToServer(
|
final headerParam = _dioClient.getHeaders();
|
||||||
_dioClient,
|
headerParam[HttpHeaders.contentTypeHeader] = fileInfo.mimeType;
|
||||||
uploadUri,
|
headerParam[HttpHeaders.contentLengthHeader] = fileInfo.fileSize;
|
||||||
fileInfo,
|
final data = fileInfo.readStream;
|
||||||
|
|
||||||
|
final resultJson = await _dioClient.post(
|
||||||
|
Uri.decodeFull(uploadUri.toString()),
|
||||||
|
options: Options(headers: headerParam),
|
||||||
|
data: data,
|
||||||
cancelToken: cancelToken,
|
cancelToken: cancelToken,
|
||||||
onSendProgress: (count, total) {
|
onSendProgress: (count, total) {
|
||||||
log('FileUploader::_handleUploadAttachmentActionOnWeb():onSendProgress: [${uploadId.id}] = $count');
|
log('FileUploader::_handleUploadAttachmentActionOnWeb():onSendProgress: [${uploadId.id}] = $count');
|
||||||
@@ -119,44 +122,10 @@ class FileUploader {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
log('FileUploader::_handleUploadAttachmentActionOnWeb():resultJson: $resultJson');
|
log('FileUploader::_handleUploadAttachmentActionOnWeb():resultJson: $resultJson');
|
||||||
|
|
||||||
if (cancelToken?.isCancelled == true) {
|
|
||||||
log('FileUploader::_handleUploadAttachmentActionOnWeb(): upload is cancelled');
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return _parsingResponse(resultJson: resultJson, fileName: fileInfo.fileName);
|
return _parsingResponse(resultJson: resultJson, fileName: fileInfo.fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
static Future<dynamic> _invokeRequestToServer(
|
|
||||||
DioClient dioClient,
|
|
||||||
Uri uploadUri,
|
|
||||||
FileInfo fileInfo, {
|
|
||||||
CancelToken? cancelToken,
|
|
||||||
ProgressCallback? onSendProgress
|
|
||||||
}) {
|
|
||||||
final headerParam = dioClient.getHeaders();
|
|
||||||
headerParam[HttpHeaders.contentTypeHeader] = fileInfo.mimeType;
|
|
||||||
headerParam[HttpHeaders.contentLengthHeader] = fileInfo.fileSize;
|
|
||||||
|
|
||||||
final data = fileInfo.readStream ?? File(fileInfo.filePath).openRead();
|
|
||||||
|
|
||||||
if (cancelToken?.isCancelled == true) {
|
|
||||||
log('FileUploader::_invokeRequestToServer(): upload is cancelled');
|
|
||||||
return Future.value();
|
|
||||||
}
|
|
||||||
|
|
||||||
return dioClient.post(
|
|
||||||
Uri.decodeFull(uploadUri.toString()),
|
|
||||||
options: Options(headers: headerParam),
|
|
||||||
data: data,
|
|
||||||
cancelToken: cancelToken,
|
|
||||||
onSendProgress: onSendProgress
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
static Attachment? _parsingResponse({dynamic resultJson, required String fileName}) {
|
static Attachment? _parsingResponse({dynamic resultJson, required String fileName}) {
|
||||||
log('FileUploader::_parsingResponse():resultJson: $resultJson');
|
log('FileUploader::_parsingResponse():resultJson: $resultJson');
|
||||||
if (resultJson != null) {
|
if (resultJson != null) {
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
import 'package:model/upload/file_info.dart';
|
||||||
|
import 'package:tmail_ui_user/features/upload/domain/model/mobile_file_upload.dart';
|
||||||
|
|
||||||
|
extension FileInfoExtension on FileInfo {
|
||||||
|
MobileFileUpload toMobileFileUpload() => MobileFileUpload(fileName, filePath, fileSize, mimeType);
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
|
||||||
|
import 'package:equatable/equatable.dart';
|
||||||
|
|
||||||
|
class MobileFileUpload with EquatableMixin {
|
||||||
|
final String fileName;
|
||||||
|
final String filePath;
|
||||||
|
final int fileSize;
|
||||||
|
final String mimeType;
|
||||||
|
|
||||||
|
MobileFileUpload(
|
||||||
|
this.fileName,
|
||||||
|
this.filePath,
|
||||||
|
this.fileSize,
|
||||||
|
this.mimeType
|
||||||
|
);
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [
|
||||||
|
fileName,
|
||||||
|
filePath,
|
||||||
|
fileSize,
|
||||||
|
mimeType,
|
||||||
|
];
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user