【问题标题】:How to upload Multi images by http package to mysql flutter如何通过http包上传多张图片到mysql flutter
【发布时间】:2021-05-10 21:18:05
【问题描述】:

我一直在寻找如何让用户选择一组图像并通过image_picker将它们上传到数据库。我在以下主题中找到了我的请求: enter link description here

以及网站上的其他类似主题。

我尝试通过http包和php文件上传图片到数据库。代码有效,尝试成功,但问题是只上传了一张图片。如何解决这个问题我需要一次上传所有的图片。

代码:



void main() {
  runApp(
    MyApp(),

  );
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: '',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: PickImages(),
    );
  }
}
class PickImages extends StatefulWidget {
  @override
  _PickImagesState createState() => _PickImagesState();
}

class _PickImagesState extends State<PickImages> {
  static final String uploadEndPoint = 'https://****************.php';
  List<Object> images = List<Object>();
  Future<File> _imageFile;
  bool _isVisible = false;
String base64Image;
  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");
    });
  }


  startUpload() {
    String NameImage = DateTime.now().millisecondsSinceEpoch.toString();
    {
      http.post(uploadEndPoint, body: {
        "image": base64Image,
        "NameImage": NameImage,

      }).then((result) {
        if (result.statusCode == 200) {
          print('dddddddddddddddd ${result.statusCode}');
        } else {

        }
      }).catchError((error) {

      });
    }
  }


  @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();
                   // base64Image = base64Encode(snapshot.data.readAsBytesSync());
                     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']);
                                });
                              },
                            ),
                          ),
                         
                        ],
                      ),
                    );
                  } 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: () {
              startUpload();
            },
          ),
        ],
      ),
    );
  }
}

class ImageUploadModel {
  File imageFile;

  ImageUploadModel({
    this.imageFile,
  });
}

<?php
        $image = $_POST['image'];

   $NameImage = $_POST['NameImage'];
    include 'connt.php';

        $path = "ImageCat/$NameImage.png";

        $actualpath = "https://*****.com/*****/$path";


$sql = "INSERT INTO  Cate (image) VALUES (?)";      

$stmt = $con->prepare($sql); 

$stmt->bind_param("s",$actualpath);

$stmt->execute();

$result = $stmt->get_result();
        

    //  if(mysqli_query($conn,$sql)){

            file_put_contents($path,base64_decode($image));

            echo "Successfully Uploaded";

    //  }

        

    $stmt->close();

?> 

【问题讨论】:

    标签: flutter


    【解决方案1】:

    您可以使用HTTPMultipartFile

    try {
          var request = http.MultipartRequest(
              "POST", Uri.parse("url"));
    
          var photo1 = await http.MultipartFile.fromPath("photo1", _imageFile1.path);
          var photo2 = await http.MultipartFile.fromPath("photo2", _imageFile2.path);
    
          request.files.add(photo1);
          request.files.add(photo2);
    
          request.fields["additional_data"] = "data";
    
          var response = await request.send();
          response.stream.asBroadcastStream();
        
          if (response.statusCode == 200) {
            response.stream.transform(utf8.decoder).listen((value) async {
              Map<String, dynamic> result = json.decode(value);    
              print(result);
            });
          } else {
            print("error");
          }
        } catch (e) {
          print(e);
    }
    

    【讨论】:

      猜你喜欢
      • 2020-12-05
      • 1970-01-01
      • 2020-07-08
      • 2020-08-14
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 2015-06-18
      • 1970-01-01
      相关资源
      最近更新 更多