TF-629 Download file and get the contentType to open file in Android/iOS

This commit is contained in:
Dat PHAM HOANG
2022-06-08 22:25:00 +07:00
committed by Dat H. Pham
parent 40a470dc21
commit ee692d52a2
14 changed files with 179 additions and 114 deletions
+87 -81
View File
@@ -1,20 +1,80 @@
library core;
export 'package:core/domain/extensions/media_type_extension.dart';
// Preview
export 'package:core/domain/preview/document_uti.dart';
export 'package:core/domain/preview/supported_preview_file_types.dart';
// Extensions
export 'presentation/extensions/color_extension.dart';
export 'presentation/extensions/url_extension.dart';
export 'presentation/extensions/capitalize_extension.dart';
export 'presentation/extensions/list_extensions.dart';
export 'domain/extensions/datetime_extension.dart';
export 'presentation/extensions/html_extension.dart';
export 'presentation/extensions/compare_string_extension.dart';
export 'presentation/extensions/compare_list_extensions.dart';
export 'domain/extensions/media_type_extension.dart';
export 'data/constants/constant.dart';
// Exceptions
export 'domain/exceptions/download_file_exception.dart';
export 'data/extensions/options_extensions.dart';
// Local
export 'data/local/config/database_config.dart';
export 'data/local/config/email_address_table.dart';
export 'data/local/database_client.dart';
export 'data/local/database_manager.dart';
export 'data/model/query/query_parameter.dart';
// Model
export 'data/model/source_type/data_source_type.dart';
// Utils
export 'presentation/utils/theme_utils.dart';
export 'presentation/utils/responsive_utils.dart';
export 'presentation/utils/keyboard_utils.dart';
export 'presentation/utils/style_utils.dart';
export 'presentation/utils/app_toast.dart';
export 'presentation/utils/html_transformer/html_template.dart';
export 'presentation/utils/html_transformer/html_transform.dart';
export 'presentation/utils/html_transformer/transform_configuration.dart';
export 'presentation/utils/html_transformer/dom/add_tooltip_link_transformers.dart';
export 'data/utils/device_manager.dart';
export 'utils/app_logger.dart';
export 'utils/benchmark.dart';
export 'utils/fps_manager.dart';
export 'utils/build_utils.dart';
// Views
export 'presentation/views/text/slogan_builder.dart';
export 'presentation/views/text/text_field_builder.dart';
export 'presentation/views/text/input_decoration_builder.dart';
export 'presentation/views/text/text_builder.dart';
export 'presentation/views/text/rich_text_builder.dart';
export 'presentation/views/responsive/responsive_widget.dart';
export 'presentation/views/list/tree_view.dart';
export 'presentation/views/button/button_builder.dart';
export 'presentation/views/button/icon_button_web.dart';
export 'presentation/views/image/avatar_builder.dart';
export 'presentation/views/list/sliver_grid_delegate_fixed_height.dart';
export 'presentation/views/image/icon_builder.dart';
export 'presentation/views/context_menu/context_menu_action_builder.dart';
export 'presentation/views/context_menu/context_menu_builder.dart';
export 'presentation/views/context_menu/context_menu_header_builder.dart';
export 'presentation/views/context_menu/simple_context_menu_action_builder.dart';
export 'presentation/views/dialog/downloading_file_dialog_builder.dart';
export 'presentation/views/dialog/confirmation_dialog_builder.dart';
export 'presentation/views/dialog/edit_text_dialog_builder.dart';
export 'presentation/views/background/background_widget_builder.dart';
export 'presentation/views/html_viewer/html_content_viewer_widget.dart';
export 'presentation/views/html_viewer/html_content_viewer_on_web_widget.dart';
export 'presentation/views/html_viewer/html_viewer_controller_for_web.dart';
export 'presentation/views/floating_button/scrolling_floating_button_animated.dart';
export 'presentation/views/bottom_popup/cupertino_action_sheet_action_builder.dart';
export 'presentation/views/bottom_popup/cupertino_action_sheet_builder.dart';
export 'presentation/views/bottom_popup/confirmation_dialog_action_sheet_builder.dart';
export 'presentation/views/modal_sheets/edit_text_modal_sheet_builder.dart';
export 'presentation/views/search/search_bar_view.dart';
export 'presentation/views/popup_menu/popup_menu_item_widget.dart';
export 'presentation/views/tab_bar/custom_tab_indicator.dart';
export 'presentation/views/quick_search/quick_search_input_form.dart';
export 'presentation/views/toast/toast_position.dart';
export 'presentation/views/toast/tmail_toast.dart';
// Resources
export 'presentation/resources/assets_paths.dart';
export 'presentation/resources/image_paths.dart';
// Constants
export 'presentation/constants/constants_ui.dart';
export 'data/constants/constant.dart';
// Network
export 'data/network/config/dynamic_url_interceptors.dart';
export 'data/network/config/service_path.dart';
@@ -22,73 +82,19 @@ export 'data/network/dio_client.dart';
export 'data/network/download/download_client.dart';
export 'data/network/download/download_manager.dart';
export 'data/network/download/downloaded_response.dart';
export 'data/utils/device_manager.dart';
// Exceptions
export 'domain/exceptions/download_file_exception.dart';
export 'domain/extensions/datetime_extension.dart';
// Constants
export 'presentation/constants/constants_ui.dart';
export 'presentation/extensions/capitalize_extension.dart';
// Extensions
export 'presentation/extensions/color_extension.dart';
export 'presentation/extensions/compare_list_extensions.dart';
export 'presentation/extensions/compare_string_extension.dart';
export 'presentation/extensions/html_extension.dart';
export 'presentation/extensions/list_extensions.dart';
export 'presentation/extensions/url_extension.dart';
// Resources
export 'presentation/resources/assets_paths.dart';
export 'presentation/resources/image_paths.dart';
export 'presentation/state/app_state.dart';
export 'presentation/state/failure.dart';
export 'data/network/download/download_client.dart';
// State
export 'presentation/state/success.dart';
export 'presentation/utils/app_toast.dart';
export 'presentation/utils/html_transformer/dom/add_tooltip_link_transformers.dart';
export 'presentation/utils/html_transformer/html_template.dart';
export 'presentation/utils/html_transformer/html_transform.dart';
export 'presentation/utils/html_transformer/transform_configuration.dart';
export 'presentation/utils/keyboard_utils.dart';
export 'presentation/utils/responsive_utils.dart';
export 'presentation/utils/style_utils.dart';
// Utils
export 'presentation/utils/theme_utils.dart';
export 'presentation/views/background/background_widget_builder.dart';
export 'presentation/views/bottom_popup/confirmation_dialog_action_sheet_builder.dart';
export 'presentation/views/bottom_popup/cupertino_action_sheet_action_builder.dart';
export 'presentation/views/bottom_popup/cupertino_action_sheet_builder.dart';
export 'presentation/views/button/button_builder.dart';
export 'presentation/views/button/icon_button_web.dart';
export 'presentation/views/context_menu/context_menu_action_builder.dart';
export 'presentation/views/context_menu/context_menu_builder.dart';
export 'presentation/views/context_menu/context_menu_header_builder.dart';
export 'presentation/views/context_menu/simple_context_menu_action_builder.dart';
export 'presentation/views/dialog/confirmation_dialog_builder.dart';
export 'presentation/views/dialog/downloading_file_dialog_builder.dart';
export 'presentation/views/dialog/edit_text_dialog_builder.dart';
export 'presentation/views/floating_button/scrolling_floating_button_animated.dart';
export 'presentation/views/html_viewer/html_content_viewer_on_web_widget.dart';
export 'presentation/views/html_viewer/html_content_viewer_widget.dart';
export 'presentation/views/html_viewer/html_viewer_controller_for_web.dart';
export 'presentation/views/image/avatar_builder.dart';
export 'presentation/views/image/icon_builder.dart';
export 'presentation/views/list/sliver_grid_delegate_fixed_height.dart';
export 'presentation/views/list/tree_view.dart';
export 'presentation/views/modal_sheets/edit_text_modal_sheet_builder.dart';
export 'presentation/views/popup_menu/popup_menu_item_widget.dart';
export 'presentation/views/quick_search/quick_search_input_form.dart';
export 'presentation/views/responsive/responsive_widget.dart';
export 'presentation/views/search/search_bar_view.dart';
export 'presentation/views/tab_bar/custom_tab_indicator.dart';
export 'presentation/views/text/input_decoration_builder.dart';
export 'presentation/views/text/rich_text_builder.dart';
// Views
export 'presentation/views/text/slogan_builder.dart';
export 'presentation/views/text/text_builder.dart';
export 'presentation/views/text/text_field_builder.dart';
export 'presentation/views/toast/tmail_toast.dart';
export 'presentation/views/toast/toast_position.dart';
export 'utils/app_logger.dart';
export 'utils/benchmark.dart';
export 'utils/build_utils.dart';
export 'utils/fps_manager.dart';
export 'presentation/state/failure.dart';
export 'presentation/state/app_state.dart';
// Local
export 'data/local/config/database_config.dart';
export 'data/local/config/email_address_table.dart';
export 'data/local/database_client.dart';
export 'data/local/database_manager.dart';
// Model
export 'data/model/source_type/data_source_type.dart';
export 'data/model/query/query_parameter.dart';
@@ -1,30 +1,35 @@
import 'dart:async';
import 'dart:io';
import 'package:http/http.dart' as http;
import 'package:universal_html/html.dart' as html;
import 'package:core/core.dart';
import 'package:core/data/network/download/downloaded_response.dart';
import 'package:dio/dio.dart';
import 'package:http/http.dart' as http;
import 'package:http_parser/http_parser.dart';
import 'package:universal_html/html.dart' as html;
class DownloadManager {
final DownloadClient _downloadClient;
DownloadManager(this._downloadClient);
Future<String> downloadFile(
Future<DownloadedResponse> downloadFile(
String downloadUrl,
Future<Directory> directoryToSave,
String filename,
String basicAuth,
{CancelToken? cancelToken}
) async {
final streamController = StreamController<String>();
final streamController = StreamController<DownloadedResponse>();
try {
await Future.wait([
_downloadClient.downloadFile(downloadUrl, basicAuth, cancelToken),
directoryToSave
]).then((values) {
final fileStream = (values[0] as ResponseBody).stream;
final response = (values[0] as ResponseBody);
final mediaType = _extractMediaTypeFromResponse(response);
final fileStream = response.stream;
final tempFilePath = '${(values[1] as Directory).absolute.path}/$filename';
final file = File(tempFilePath);
@@ -52,7 +57,7 @@ class DownloadManager {
if (cancelToken != null && cancelToken.isCancelled) {
streamController.sink.addError(CancelDownloadFileException(cancelToken.cancelError?.message));
} else {
streamController.sink.add(tempFilePath);
streamController.sink.add(DownloadedResponse(tempFilePath, mediaType: mediaType));
}
await streamController.close();
}, onError: (error) async {
@@ -100,4 +105,14 @@ class DownloadManager {
return false;
}
MediaType? _extractMediaTypeFromResponse(ResponseBody responseBody) {
try {
final contentType = responseBody.headers[Headers.contentTypeHeader];
return MediaType.parse(contentType!.first);
} catch (e) {
logError('DownloadManager::_extractMediaTypeFromResponse(): $e');
return null;
}
}
}