uploadImageToS3 method
////////////////////////////////////////////////////////////////////////
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;
}
}