My problem is that I am uploading files to a google bucket storage from a Flutter application. The files I upload are simple images like signatures or photos (code below).
When I upload them and try to get a preview or download them back from the bucket, it says I do not support this file format.
I am trying to use this documentation (I need to use the Rest approach since I have to log in with an STS Token): https://cloud.google.com/storage/docs/uploading-objects
How I get the image base64 string (value is usable when I try it on https://base64.guru/converter/decode/file)
final data = await _signaturePadKey.currentState!
.toImage(pixelRatio: 3.0);
final image = await data.toByteData(
format: ui.ImageByteFormat.png);
// To send
final base64String =
base64.encode(image!.buffer.asUint8List());
setState(() => {_signatureFile = base64String});
How I send it :
Future postOKTrackingSignature(String signature, String projectID) async {
await refreshSTSToken(projectID);
String token = await getSTSToken();
// Headers
var headersData = {
"Authorization": "Bearer $token",
"Content-Type": "image/png"
};
// URL building
var resourcePart =
"xxx";
var paramsData = {
'uploadType': 'multipart',
'name': "${resourcePart}signature.png",
};
var baseURI = 'https://storage.googleapis.com/upload/storage/v1/b/';
String bucketName = "xxx";
var query = paramsData.entries.map((p) => '${p.key}=${p.value}').join('&');
// Body
// var dataPrepation = base64.normalize(signature);
var bodyData = "data:image/png;base64,$signature";
final response = await http.post(
Uri.parse("$baseURI$bucketName/o?$resourcePart$query"),
headers: headersData,
body: bodyData);
switch (response.statusCode) {
case 200:
return {"statusCode": response.statusCode};
default:
return {"statusCode": response.statusCode, "error": response.body};
}
}