Image 在颤振中使用多部分上传图像

Image 在颤振中使用多部分上传图像,image,flutter,file-upload,signature,signaturepad,Image,Flutter,File Upload,Signature,Signaturepad,我想上传一张来自签名板的图片,格式是unit8list,我想在Flatter中使用multipart上传该图片 我的签名密码是:- import 'dart:typed_data'; import 'dart:ui'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter_app/Screens/next.dart'; import 'pac

我想上传一张来自签名板的图片,格式是unit8list,我想在Flatter中使用multipart上传该图片

我的签名密码是:-

import 'dart:typed_data';
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter_app/Screens/next.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:signature/signature.dart';

class signature_pad extends StatefulWidget {
  @override
  _signature_padState createState() => _signature_padState();
}

class _signature_padState extends State<signature_pad> {
  var file;
  String bytes2;
  GlobalKey _globalKey = GlobalKey();
  final SignatureController _controller = SignatureController(
    penStrokeWidth: 5,
    penColor: Colors.black,
    exportBackgroundColor: Colors.white,

  );
  setsignePref(var sign) async {
    SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
    setState(() {
      sharedPreferences.setString("sign", sign);
    });
  }

  @override
  void initState() {
    super.initState();
    _controller.addListener(() => print('Value changed'));
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Builder(
        builder: (BuildContext context) => Scaffold(
          body: ListView(
            children: <Widget>[ // SIGNATURE CANVAS
              Signature(
                controller: _controller,
                height: MediaQuery.of(context).size.height/1.12,
                backgroundColor: Colors.white,
              ),
              //OK AND CLEAR BUTTONS
              Container(
                decoration: const BoxDecoration(color: Colors.black),
                child: Row(
                  mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                  mainAxisSize: MainAxisSize.max,
                  children: <Widget>[
                    //SHOW EXPORTED IMAGE IN NEW ROUTE
                    IconButton(
                      icon: const Icon(Icons.check),
                      color: Colors.blue,
                      onPressed: () async {
                        if (_controller.isNotEmpty) {
                          final Uint8List data = await _controller.toPngBytes();
                          await Navigator.of(context).push(
                            MaterialPageRoute<void>(
                              builder: (BuildContext context) {
                                return Scaffold(
                                  appBar: AppBar(),
                                  body: Column(
                                    children: [
                                      Center(
                                        child: Container(
                                          color: Colors.grey[300],
                                          child: Image.memory(data),
                                        ),
                                      ),
                                      Padding(
                                        padding: const EdgeInsets.all(20),
                                        child: new RaisedButton(
                                          onPressed: ()  {
                                            Navigator.push(context, MaterialPageRoute(builder: (context)=> next(image : data)));
                                          },
                                          child: new Text('Submit'),
                                        ),
                                      ),                                  ],
                                  ),
                                );
                              },
                            ),
                          );
                        }
                      },
                    ),
                    //CLEAR CANVAS
                    IconButton(
                      icon: const Icon(Icons.clear),
                      color: Colors.blue,
                      onPressed: () {
                        setState(() => _controller.clear());
                      },
                    ),
                  ],
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
导入'dart:typed_data';
导入“dart:ui”;
进口“包装:颤振/材料.省道”;
导入“package:flatter/rendering.dart”;
导入“package:flatter_app/Screens/next.dart”;
导入“package:shared_preferences/shared_preferences.dart”;
导入“包装:签名/签名.dart”;
类签名\u pad扩展StatefulWidget{
@凌驾
_签名\u padState createState()=>\u签名\u padState();
}
类_签名_padState扩展状态{
var文件;
字符串字节2;
GlobalKey _GlobalKey=GlobalKey();
最终签名控制器_控制器=签名控制器(
笔划宽度:5,
铅笔颜色:颜色,黑色,
exportBackgroundColor:Colors.white,
);
setsignePref(var符号)异步{
SharedReferences SharedReferences=等待SharedReferences.getInstance();
设置状态(){
SharedReferences.setString(“符号”,符号);
});
}
@凌驾
void initState(){
super.initState();
_controller.addListener(()=>print('Value changed'));
}
@凌驾
小部件构建(构建上下文){
返回材料PP(
debugShowCheckedModeBanner:false,
住家:建筑商(
生成器:(BuildContext上下文)=>Scaffold(
正文:ListView(
子项:[//签名画布
签名(
控制器:_控制器,
高度:MediaQuery.of(context).size.height/1.12,
背景颜色:Colors.white,
),
//确定和清除按钮
容器(
装饰:const BOX装饰(颜色:Colors.black),
孩子:排(
mainAxisAlignment:mainAxisAlignment.space,
mainAxisSize:mainAxisSize.max,
儿童:[
//在新路由中显示导出的图像
图标按钮(
图标:常量图标(图标。检查),
颜色:颜色,蓝色,
onPressed:()异步{
if(_controller.isNotEmpty){
最终UINT8列表数据=等待_controller.toPngBytes();
等待导航器。的(上下文)。推送(
材料路线(
生成器:(BuildContext上下文){
返回脚手架(
appBar:appBar(),
正文:专栏(
儿童:[
居中(
子:容器(
颜色:颜色。灰色[300],
子项:映像。内存(数据),
),
),
填充物(
填充:常数边集。全部(20),
孩子:新升起的按钮(
已按下:(){
push(context,materialpage(builder:(context)=>next(image:data));
},
子项:新文本(“提交”),
),
),                                  ],
),
);
},
),
);
}
},
),
//透明帆布
图标按钮(
图标:常量图标(图标清除),
颜色:颜色,蓝色,
已按下:(){
设置状态(()=>_controller.clear());
},
),
],
),
),
],
),
),
),
);
}
}
我的上传页面是:-

import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_app/Screens/navidrawer.dart';
import 'package:flutter_app/Screens/signature_pad.dart';
import 'package:flutter_app/Url.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:image_picker/image_picker.dart';
import 'package:path_provider/path_provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:http/http.dart' as http;

class next extends StatefulWidget {
  final String CompanyCode;
  final Uint8List  image;
  final String docketno;
  next({Key key,this.CompanyCode,this.image,this.docketno}) : super(key: key);
  @override
  _nextState createState() => _nextState();
}

class _nextState extends State<next> {
  List<OriginModel> OriginModelList = [];
  String selectedOrigin;
  // final networkHandler = NetworkHandler();
  bool circular = false;
  final _globalkey = GlobalKey<FormState>();
  final ImagePicker _picker = ImagePicker();
  PickedFile _imageFile;
  bool _obscuredText = true;
  var okData;
  var user_id;
  var responseResult;
  var loading = false;
  var count = 0;
  var myData;
  final _formKey = GlobalKey<FormState>();
  var bytes;
  Future<String> getUserIdPref() async{
    SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
    setState(() {
      user_id = sharedPreferences.getString("user_id");
    });
    return user_id;
  }
  void UploadImage() async {
    var request = http.MultipartRequest('POST', Uri.parse(URLs.image));
    request.fields['CompanyCode']= "${widget.CompanyCode}";
    request.fields['empCode'] = "$user_id";
    request.fields['documentType']= "POD";
    if (_imageFile != null && widget.image == null) {
      print('AddingUserProfilePic ${_imageFile.path}and $user_id');
      request.files
          .add(await http.MultipartFile.fromPath('file', _imageFile.path));
    }
    else if(widget.image !=null && _imageFile == null){
      bytes = (await rootBundle.load(Image.memory(widget.image).toString())).buffer.asUint8List();
      request.files.add(http.MultipartFile.fromBytes('file', bytes));
    }
    var response = await request.send();
    var responseBody = await http.Response.fromStream(response);
    myData = json.decode(responseBody.body);
    print('Status code is : ${response.statusCode}  && ${response}');
    if (response.statusCode == 200) {
      Fluttertoast.showToast(msg: 'Uploaded Successfully');
      Navigator.popUntil(context, (route) {
        return count++ == 2;
      });
    } else {
      Fluttertoast.showToast(msg: 'Upload Failed');
    }
  }


  @override
  void initState() {
    super.initState();
    this .getUserIdPref();

  }
  List<Widget> _buildForm(BuildContext context) {
    var l = List<Widget>();
    // Image img = Image.memory(widget.image);
    Container container = Container(
      height: MediaQuery.of(context).size.height,
      width: MediaQuery.of(context).size.width,
      alignment: AlignmentDirectional.topCenter,
      child:Form(
        key: _formKey,
        child: SingleChildScrollView(
          child: Container(
            child:Column(
              children: [
                SizedBox(height: MediaQuery.of(context).size.height/20 ),
                Container(
                  margin: EdgeInsets.only(top: 15),
                  child:
                  _imageFile == null && widget.image == null ? CircleAvatar(
                    radius: 80.0,
                    backgroundImage: NetworkImage(
                        "https://img.freepik.com/free-vector/illustration-document-icon_53876-37007.jpg?size=626&ext=jpg&ga=GA1.2.1768032709.1573116529")
                    ) :
                  _imageFile != null && widget.image == null ?
                  CircleAvatar(
          radius: 80.0,
          backgroundImage: FileImage(File(_imageFile.path)),)
     : Container(
                    color: Colors.grey[300],
                    child: Image.memory(widget.image),
                  ),
                  ),
                SizedBox(height: MediaQuery.of(context).size.height/30 ),
                Column(
                  crossAxisAlignment : CrossAxisAlignment.start,
                  children: [
                    Container( margin: EdgeInsets.only(left: 10,right: 10),
                      child: Text(
                        'DOCUMENT TYPE'.toUpperCase(),
                        style: TextStyle(
                            color: Colors.black,
                            fontSize: 16,
                            fontWeight: FontWeight.bold),
                      ),
                    ),
                    SizedBox(height: MediaQuery.of(context).size.height/40 ),
                    Container(margin: EdgeInsets.only(left: 10,right: 10),
                      decoration: BoxDecoration(
                          borderRadius: BorderRadius.circular(10.0),
                          color: Colors.cyan,
                          border: Border.all()),
                      width: MediaQuery.of(context).size.width,
                      padding: const EdgeInsets.all(10.0),
                      child: DropdownButtonHideUnderline(
                        child: Theme(
                          data: Theme.of(context).copyWith(
                            canvasColor: Colors.cyan,
                          ),
                          child: new DropdownButton<String>(
                            hint: new Text("Select Document Type",style: TextStyle(color: Colors.white) ,),
                            value: selectedOrigin,
                            isDense: true,
                            onChanged: (String newValue) {
                              setState(() {
                                selectedOrigin = newValue;
                              });
                              print(selectedOrigin);
                            },
                            items: OriginModelList.map((OriginModel map) {
                              return new DropdownMenuItem<String>(
                                value: map.id,
                                child: new Text(map.name,
                                    style: new TextStyle(color: Colors.white)),
                              );
                            }
                            ).toList(),
                          ),
                        ),
                      ),
                    ),
                  ],
                ),
                GestureDetector(
                  onTap: (){
                    Navigator.push(context, MaterialPageRoute(builder: (context)=> signature_pad()));
                  },
                  child: Container(
                    margin: EdgeInsets.only(left: 10,right: 10,top: 30),
                    width: MediaQuery.of(context).size.width,
                    height: 70,
                    color: Colors.cyan,
                    child: Row(
                      children: [
                        Container(
                          child: Image.asset(
                              "assets/register.png"
                          ),
                          height: 60,
                          margin: EdgeInsets.only(left: 5),
                        ),
                        Container(margin:EdgeInsets.only(left: 10),child: Text("Signature",style: TextStyle(color: Colors.white))),
                      ],
                    ),
                  ),
                ),
                GestureDetector(
                  onTap: (){
                    _showAlertDialog();
                  },
                  child: Container(
                    margin: EdgeInsets.only(left: 10,right: 10,top: 20),
                    width: MediaQuery.of(context).size.width,
                    height: 70,
                    color: Colors.cyan,
                    child: Row(
                      children: [
                        Container(
                          child: Image.asset(
                              "assets/upload.png"
                          ),
                          height: 60,
                          margin: EdgeInsets.only(left: 5),
                        ),
                        Container(margin:EdgeInsets.only(left: 10),child: Text("Image",style: TextStyle(color: Colors.white))),
                      ],
                    ),
                  ),
                ),
                SizedBox(height: MediaQuery.of(context).size.height/30 ),
                Padding(
                  padding: const EdgeInsets.all(30.0),
                  child: GestureDetector(
                    onTap: (){
                      if (_formKey.currentState.validate()) {
                        setState(() {
                          loading = true;
                        });
                        UploadImage();
                      }
                    },
                    child: Container(
                      height: 55.0,
                      width: 600.0,
                      child: Text(
                        'SAVE',
                        style: TextStyle(
                            color: Colors.white,
                            letterSpacing: 0.2,
                            fontFamily: "Sans",
                            fontSize: 18.0,
                            fontWeight: FontWeight.w800),
                      ),
                      alignment: FractionalOffset.center,
                      decoration: BoxDecoration(
                          boxShadow: [
                            BoxShadow(color: Colors.black38, blurRadius: 15.0)
                          ],
                          borderRadius: BorderRadius.circular(30.0),
                          gradient: LinearGradient(colors: <Color>[
                            Colors.cyan[300],
                            Colors.cyan[600],
                          ])),
                    ),
                  ),
                ),
              ],
            ),
          ),
        ),
      ),
    );
    l.add(container);
    if (loading) {
      var modal = Container(
        height: MediaQuery.of(context).size.height,
        width: MediaQuery.of(context).size.width,
        child: Stack(
          children: [
            Opacity(
              opacity: 0.3,
              child: const ModalBarrier(dismissible: false, color: Colors.grey),
            ),
            Center(
              child: new CircularProgressIndicator(),
            ),
          ],
        ),
      );
      l.add(modal);
    }

    return l;
  }

  @override
  Widget build(BuildContext context) {
    OriginModelList = [
      OriginModel('1', "POD"),
      OriginModel('2', "SIGNATURE"),
    ];
    return Scaffold(
      appBar: AppBar(
        title: Text(
          'OPERATIONS',
          style: TextStyle(color: Colors.white, fontSize: 16),
        ),
        actions: <Widget>[
          Padding(
              padding: EdgeInsets.only(right: 20.0),
              child: GestureDetector(
                onTap: () {},
                child: Icon(
                  Icons.chat,
                  size: 26.0,
                ),
              )

          ),
          Padding(
              padding: EdgeInsets.only(right: 20.0),
              child: GestureDetector(
                onTap: () {},
                child: Icon(
                  Icons.call,
                ),
              )
          ),
        ],
        elevation: 0,
        backgroundColor:Colors.cyan,
        brightness: Brightness.light,
      ),
      body: Stack(
        alignment: AlignmentDirectional.bottomCenter,
        children: _buildForm(context),
      ),
      drawer:  NaviDrawer(),
    );
  }
  void _showAlertDialog()
  {
    showDialog(
        context: context,
        barrierDismissible: true,
        builder: (BuildContext context)
        {
          return AlertDialog(
            title: new Text('Make your choice!'),
            content: Container(
              height: 80,
              child: Column(
                children: [
                  GestureDetector(
                    onTap: (){
                      takePhoto(ImageSource.camera);
                    },
                    child: Row(
                      children: [
                        Icon(Icons.camera),
                        Container(
                            margin: EdgeInsets.only(left: 5),
                            child: new Text('Camera')),
                      ],
                    ),
                  ),
                  GestureDetector(
                    onTap: (){
                      takePhoto(ImageSource.gallery);
                    },
                    child: Container(
                      margin: EdgeInsets.only(top: 10),
                      child: Row(
                        children: [
                          Icon(Icons.image),
                          Container(                        margin: EdgeInsets.only(left: 5),
                              child: new Text('Gallery')),
                        ],
                      ),
                    ),
                  ),

                ],
              ),
            ),
          );
        }
    );
  }

  void takePhoto(ImageSource source) async {
    final pickedFile = await _picker.getImage(
      source: source,
    );
    setState(() {
      _imageFile = pickedFile;
    });
  }
}
class OriginModel {
  String id;
  String name;

  @override
  String toString() {
    return '$id $name';
  }

  OriginModel(this.id, this.name);
}
导入'dart:convert';
导入“dart:io”;
导入“dart:键入的_数据”;
进口“包装:颤振/cupertino.dart”;
进口“包装:颤振/材料.省道”;
导入“包:flifter/services.dart”;
导入“包:颤振应用程序/屏幕/navidrawer.dart”;
导入“包:颤振应用程序/屏幕/签名板.省道”;
导入“package:flatter_app/Url.dart”;
进口“包装:fluttoast/fluttoast.dart”;
导入“包:image_picker/image_picker.dart”;
导入“package:path_provider/path_provider.dart”;
导入“package:shared_preferences/shared_preferences.dart”;
将“package:http/http.dart”导入为http;
类下一步扩展StatefulWidget{
最终字符串公司代码;
最终UInt8列表图像;
最终字符串docketno;
下一步({Key-Key,this.CompanyCode,this.image,this.docketno}):super(Key:Key);
@凌驾
_nextState createState()=>\u nextState();
}
类_nextState扩展状态{
List OriginModelList=[];
字符串选择源代码;
//final networkHandler=networkHandler();
布尔循环=假;
最终的_globalkey=globalkey();
最终图像选择器_picker=图像选择器();
PickedFile\u图像文件;
bool _oblizedtext=true;
var-okData;
var用户id;
var响应结果;
var加载=假;
var计数=0;
var-myData;
final _formKey=GlobalKey();
var字节;
未来的getUserIdPref()异步{
SharedReferences SharedReferences=等待SharedReferences.getInstance();
设置状态(){
user_id=SharedReferences.getString(“user_id”);
});
返回用户id;
}
void UploadImage()异步{
var request=http.MultipartRequest('POST',Uri.parse(url.image));
request.fields['CompanyCode']=“${widge