将表单数据发布到服务器颤振

Posted

技术标签:

【中文标题】将表单数据发布到服务器颤振【英文标题】:Post form data to server flutter 【发布时间】:2020-06-14 09:14:46 【问题描述】:

我在向服务器发送post 请求时遇到了很多麻烦。它需要 form data 类型。

这是我输入后得到的错误。

  `image: [The image must be an image.]

我的大部分数据都是字符串,除了 intfile Image 由用户从图库中选择。

这是我的代码:

飞镖代码

if(_image!=null)
      setState(() 
        _isLoading = true;
      );
        SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
        var uri = NetworkUtils.host +
            AuthUtils.updateSessionRequest;
        Map<String, String> data = "_method": "PATCH",
          "first_name": widget.first_name,
          "last_name": widget.last_name,
          "phone": widget.phone,
        "industry":widget.industry,
        "country": widget.country,
        "state": widget.state,
        "fav_quote": widget.fav_quote,
        "bio_interest": widget.bio_text,
        "terms": "1",
        "company": widget.company,
        "position": widget.job_position,
        "linked_in":widget.linkedin_profile,
        "institution": widget.institution,
        "degree": widget.degree,
        "preference[0]": widget.industry;
        String authToken = sharedPreferences.getString("token");
        try 
          final response = await http.post(
            uri,
            body: data,
            headers: 
              'Accept': 'application/json',
              'Authorization': 'Bearer ' + authToken,
            ,
          );

          final responseJson = json.decode(response.body);
          print(responseJson.toString());
          if (response.statusCode == 200 || response.statusCode == 201)  
       //upload image to server after success response
       uploadImage(_image);
              NetworkUtils.showToast("Profile successfully update!");
            );
           else
            setState(() 
              _isLoading = false;
            );
            NetworkUtils.showSnackBar(_scaffoldKey, 'An error occurred. Please try again');
          
          return responseJson;
         catch (exception) 
          print(exception.toString());
          setState(() 
            _isLoading = false;
          );
          NetworkUtils.showSnackBar(_scaffoldKey, 'An error occurred. Please try again');
        
     

 uploadImage(File image) async
    var request = http.MultipartRequest(
        "POST",
        Uri.parse(NetworkUtils.host +
            AuthUtils.endPointUpdateProfile));
    request.files.add(await http.MultipartFile.fromPath(
      'image',
      image.path,
    ));

    try 
    var streamedResponse = await request.send();
    var response = http.Response.fromStream(streamedResponse);
    return response;
     catch (e) 
    rethrow;
    
  
  

【问题讨论】:

尝试打印出值uri uri 是正确的。错误来自数据内的 _image am 设置 请再次检查我在问题中的错误信息 你的头像是List? 不。它是用户个人资料的单个图像 【参考方案1】:

你需要像这样传递你的图像

request.files.add(await http.MultipartFile.fromPath(
        'image',
        _image,
      ));

这里是一个如何使用http传递文件和字符串的例子

 var request = http.MultipartRequest(
              "POST",
              Uri.parse("http://....."));
          request.fields['first_name'] = widget.first_name;
          request.fields['last_name'] = widget.last_name;
                   .....
          request.files.add(await http.MultipartFile.fromPath(
            'image',
            path,
          ));

try 
      var streamedResponse = await request.send();
      var response = http.Response.fromStream(streamedResponse);
      return response;
     catch (e) 
      rethrow;
   

【讨论】:

感谢您。那么我要从表单数据主体中删除“图像”属性吗? “图像”是您要传递给服务器的参数的名称。 请告诉我们您的最新代码和最新错误。 您是否尝试过使用其他测试api工具来测试API是否正常工作? 是的。它的工作。因为我的 formData 中的其他值被发布到服务器,除了图像。【参考方案2】:

仅从上面,稍作修改

import 'dart:async';
import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;

void executePostMethod(String title) async 
  var request = http.MultipartRequest("POST", Uri.parse("https://localhost:44377/API/GetStateList"));
  request.fields['CountryID'] = "1";
  //          .....
  //request.files.add(await http.MultipartFile.fromPath('image',path,)
  //);

   // send request to upload image
    await request.send().then((response) async 
     //print(response);

     response.stream.transform(utf8.decoder).listen((value) async 
        print(value);
        // print("ResponseVal: $value");
        if (response.statusCode == 200) 
          var imgUploadData = json.decode(value);
          print(imgUploadData);          
         else 
          throw Exception("Faild to Load!");
        
      );
    ).catchError((e) 
      print(e);
    );

【讨论】:

以上是关于将表单数据发布到服务器颤振的主要内容,如果未能解决你的问题,请参考以下文章

使用 Flutter 将表单上传到 Firestore

颤振 |如何将数据添加到 Firestore 中的现有文档

在多个屏幕中使用表单颤振“在小部件树中检测到重复的 GlobalKey”错误

如何正确预填充颤振表单字段?

从后台颤振隔离向Android方法发送平台消息

如何将我的数据从 supabase 流式传输到颤振应用程序