Upload Image/File to Strapi (Flutter Web)
Solution 1
So, I searched on the Flutter Discord for some help and I found out that my problem happens because Flutter Web can't use 'dart:io'
, and using 'dart:html'
takes away the use of all of Flutter's platforms.
I ended up using this imports:
import 'dart:convert';
import 'dart:typed_data';
import 'package:image_picker/image_picker.dart';
import 'package:http/http.dart' as http;
import 'package:http_parser/http_parser.dart';
import 'package:path/path.dart';
import 'package:async/async.dart';
and this is the function I created and worked:
Future<bool> uploadImage(
String imageFilePath,
Uint8List imageBytes,
) async {
String url = SERVERURL + "/uploadRoute";
PickedFile imageFile = PickedFile(imageFilePath);
var stream =
new http.ByteStream(DelegatingStream.typed(imageFile.openRead()));
var uri = Uri.parse(url);
int length = imageBytes.length;
var request = new http.MultipartRequest("POST", uri);
var multipartFile = new http.MultipartFile('files', stream, length,
filename: basename(imageFile.path),
contentType: MediaType('image', 'png'));
request.files.add(multipartFile);
var response = await request.send();
print(response.statusCode);
response.stream.transform(utf8.decoder).listen((value) {
print(value);
});
I had this issue using Strapi and this solution worked like a charm.
Solution 2
Upload file during entry creation with Flutter
dio: ^3.0.10
, mime: ^1.0.0
and http_parser
.
The main part is the key name of the file if it's foo
, so you have to change files.image
with files.foo
for file upload
final mimeType = mime.lookupMimeType(imageFile.path, headerBytes: [0xFF, 0xD8])?.split('/');
FormData formData = new FormData.fromMap(
{
"files.image": await MultipartFile.fromFile(
imageFile.path,
filename: imageFile.path.split('/').last,
contentType: MediaType(mimeType?[0], mimeType?[1]),
),
"data": jsonEncode({
"title": title,
"summary": summary,
"content": content,
}),
},
);
Response response = await _dio.post(
"/blogs",
data: formData,
options: Options(),
);
Diego Cattarinich Clavel
Seeking knowledge on programming as a way to solve everyday problems.
Updated on December 01, 2022Comments
-
Diego Cattarinich Clavel over 1 year
I'm trying to upload an image to Strapi through Flutter Web. I'm aware (from this link) that I need to use FormData to do so. I've researched on many ways to do this and I stumble across Dio and of course Http.
Both solutions gave me errors:
Unsupported operation: MultipartFile is only supported where dart:io is available.
I've tried this code:
var request = new http.MultipartRequest("POST", Uri.parse(url)); request.files.add( await http.MultipartFile.fromPath( "files", imageFilePath, ), ); request.send().then((response) { if (response.statusCode == 200) print("Uploaded!"); print(response.statusCode); }).catchError((e) => print(e));
As suggested here.
And many other getting errors or Empty Data (400), when I use
MultipartFile.fromBytes(...)
.I'm just trying to upload a file, therefore I assume my body should only contain the FormData with as
files
as it's mentioned on Strapi's Documentation. -
Mohammad Hadi over 3 yearswhat is DelegatingStream ?
-
Mehran Ullah almost 3 yearsError: Unsupported operation: MultipartFile is only supported where dart:io is available.
-
Muhammad Shafique over 2 yearsError: Unsupported operation: MultipartFile is only supported where dart:io is available.
-
Keff about 2 yearsThe important bit for me was to add the content-type
contentType: MediaType('image', 'png')