1

I have created a PickImages class which can takes images both from camera and gallery like below. Now I want to post the images as base64 string to a json api server.

enter image description here

Here is PickImages class.

import 'dart:convert';
import 'dart:developer';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
//import 'services/services.dart';

class PickImages extends StatefulWidget {
  @override
  _PickImagesState createState() => _PickImagesState();
}

class _PickImagesState extends State<PickImages> {
  List<Object> images = List<Object>();
  Future<File> _imageFile;
  bool _isVisible = false;

  Future _onAddImageClick(int index, int type) async {
    if (images != null)
      setState(() {
        // ignore: deprecated_member_use
        _imageFile = ImagePicker.pickImage(
          source: type == 1 ? ImageSource.camera : ImageSource.gallery,
          imageQuality: 50,
        );
        getFileImage(index);
      });
  }

  void getFileImage(int index) async {
    _imageFile.then((file) async {
      setState(() {
        ImageUploadModel imageUpload = new ImageUploadModel();
        imageUpload.imageFile = file;
        images.replaceRange(index, index + 1, [imageUpload]);
      });
    });
  }

  void showImageBox() {
    setState(() {
      _isVisible = !_isVisible;
    });
  }

  @override
  void initState() {
    super.initState();
    setState(() {
      images.add("Add Image");
      images.add("Add Image");
      images.add("Add Image");
      images.add("Add Image");
      images.add("Add Image");
      images.add("Add Image");
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Post Images'),
      ),
      body: Column(
        children: <Widget>[
          Container(
            //padding: EdgeInsets.only(right: 5),
            child: Card(
              elevation: 5,
              child: ListTile(
                trailing: Icon(Icons.attachment),
                title: Text('Attachments'),
                onTap: () {
                  showImageBox();
                },
              ),
            ),
          ),
          Visibility(
            visible: _isVisible,
            child: Padding(
              padding: const EdgeInsets.only(top: 5.0, right: 5.0),
              child: GridView.count(
                shrinkWrap: true,
                crossAxisCount: 3,
                childAspectRatio: 1,
                children: List.generate(images.length, (index) {
                  if (images[index] is ImageUploadModel) {
                    ImageUploadModel uploadModel = images[index];
                    //base64 image
                    List<int> imageBytes =
                        uploadModel.imageFile.readAsBytesSync();
                    String base64Image = base64Encode(
                        imageBytes); //'base64Image' holds the base64 image string
                    return Card(
                      clipBehavior: Clip.antiAlias,
                      child: Stack(
                        children: <Widget>[
                          Image.file(
                            uploadModel.imageFile,
                            fit: BoxFit.cover,
                            width: 300,
                            height: 300,
                          ),
                          Positioned(
                            right: 5,
                            top: 5,
                            child: InkWell(
                              child: Icon(
                                Icons.remove_circle,
                                size: 20,
                                color: Colors.red,
                              ),
                              onTap: () {
                                setState(() {
                                  images.replaceRange(
                                      index, index + 1, ['Add Image']);
                                });
                              },
                            ),
                          ),
                          RaisedButton(
                            child: Text('imgInfo'),
                            onPressed: () {
                              print(
                                  "${uploadModel.imageFile.lengthSync() / 1024} KB"); //print image size in kb
                              print(uploadModel
                                  .imageFile.path); //print image path
                              log(base64Image);
                            },
                          ),
                        ],
                      ),
                    );
                  } else {
                    return Card(
                      child: IconButton(
                        icon: Icon(Icons.camera_alt),
                        onPressed: () {
                          showModalBottomSheet(
                            context: context,
                            builder: (BuildContext context) {
                              return SafeArea(
                                child: Container(
                                  child: new Wrap(
                                    children: <Widget>[
                                      new ListTile(
                                        leading: new Icon(Icons.photo_camera),
                                        title: new Text('Camera'),
                                        onTap: () {
                                          _onAddImageClick(index, 1);
                                          Navigator.of(context).pop();
                                        },
                                      ),
                                      new ListTile(
                                          leading:
                                              new Icon(Icons.photo_library),
                                          title: new Text('Gallery'),
                                          onTap: () {
                                            _onAddImageClick(index, 2);
                                            Navigator.of(context).pop();
                                          }),
                                    ],
                                  ),
                                ),
                              );
                            },
                          );
                        },
                      ),
                    );
                  }
                }),
              ),
            ),
          ),
          RaisedButton(
            child: Text('send'),
            onPressed: () {
              //postImage(base64Image);
            },
          ),
        ],
      ),
    );
  }
}

class ImageUploadModel {
  File imageFile;

  ImageUploadModel({
    this.imageFile,
  });
}

Here is ImageModel.

class ImageModel {
  String attachment;

  ImageModel({this.attachment});

  ImageModel.fromJson(Map<String, dynamic> json) {
    attachment = json['Attachment'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['Attachment'] = this.attachment;
    return data;
  }
}

Here is services.dart where in "Attatchment" : " " I have to sent the base64 images string.

import 'dart:convert';
import 'dart:async';
import 'package:http/http.dart' as http;
import 'package:post_image/model/model.dart';

Future<ImageModel> postImage() async {
  Map data = {
    "Attachment": ""
  };
  var body = json.encode(data);

  final http.Response response = await http.post(
    'url',
    body: body,
  );
  print(response.body);
  print(body);

  if (response.statusCode == 200) {
    return ImageModel.fromJson(
      jsonDecode(response.body),
    );
  } else {
    throw Exception('Failed to send');
  }
}
  • If you use image from file, you can try solution from [this](https://stackoverflow.com/questions/50036393/how-to-convert-an-image-to-base64-image-in-flutter) answer. – fartem Jan 19 '21 at 18:39
  • I have converted images to base64. The problem is I can't post the list of image string to the server. –  Jan 19 '21 at 19:23
  • What is exception you get from server? Or it is a Dart exception? – fartem Jan 19 '21 at 19:51
  • I didn't send anything. I have to send list of images string from PickImages class through the postImage() function in services.dart. –  Jan 20 '21 at 00:55
  • I have used simplest way of image to base 64 conversation https://stackoverflow.com/a/61928845/11104759 – Lokesh May 04 '21 at 11:44

1 Answers1

0

You can follow this guide on sending data in Flutter using http.post(). To send a List<ImageModel>, you just need to encode it using json.encode() when passing it in the body of your http.post request.

Omatt
  • 8,564
  • 2
  • 42
  • 144