uploadImageToS3 method

Future<String?> uploadImageToS3()

////////////////////////////////////////////////////////////////////////

Implementation

Future<String?> uploadImageToS3() async {
  try {
// 1. Pick image
    final ImagePicker picker = ImagePicker();
    ImageSource source = ImageSource.gallery;
    final pickedFile = await picker.pickImage(source: source);
    if (pickedFile == null) return null;

// 2. Prepare upload data
    DocumentsLocalModel docs = DocumentsLocalModel(
      file: pickedFile,
      docName: 'image_${DateTime.now()}',
      fileName: pickedFile.path
          .split('/')
          .last,
    );
    final mimeType = mimeFromFileName(fileName: docs.file!.name);

    isImageUploadButtonLoading.value = true;

// 3. Get S3 upload URL
    final dio = Dio();
    FileUploadFolder folder = FileUploadFolder.productPic;
    final uploadUrlResponse = await dio.post(
      fileUploadUrl,
      data: jsonEncode({
        'project': projectNameS3Bucket,
        'mimeType': mimeType,
        'fileName': fnFileNameForS3Bucket(
          fileName: docs.docName ?? '',
          folder: folder,
          type: mimeType
              .split('/')
              .last,
        ),
      }),
      options: Options(headers: {'Content-Type': 'application/json'}),
    );

    if (uploadUrlResponse.statusCode != 200) {
      isImageUploadButtonLoading.value = false;
      return null;
    }
    final uploadUrl =
        FileUploadUrlGetterMaster
            .fromJson(uploadUrlResponse.data)
            .uploadUrl;
    if (uploadUrl == null) {
      isImageUploadButtonLoading.value = false;
      return null;
    }

// 4. Upload file to S3
    final bytes = await pickedFile.readAsBytes();
    final uploadResult = await dio.put(
      uploadUrl,
      options: Options(headers: {'content-type': mimeType}),
      data: bytes,
    );
    if (uploadResult.statusCode == 200) {
      isImageUploadButtonLoading.value = false;
      return uploadUrl
          .split('?')
          .first;
    } else {
      isImageUploadButtonLoading.value = false;
      return null;
    }
  } catch (e) {
    devPrintError('Image upload failed: $e');
    isImageUploadButtonLoading.value = false;
    return null;
  }
}