【问题标题】:Flutter how to send multiple files to http postFlutter如何将多个文件发送到http post
【发布时间】:2018-09-25 15:15:11
【问题描述】:

我想发送两个文件到 http post

卷曲看起来像这样

curl -X POST "https://api-us.faceplusplus.com/facepp/v3/compare" \
-F "api_key=<api_key>" \
-F "api_secret=<api_secret>" \
-F "image_file1 =file1" \
-F "image_file1 =file2"

我试过这样。

   File first;
   File second;
      var uri = Uri.parse('https://api-us.faceplusplus.com/facepp/v3/compare');
      var request = new http.MultipartRequest("POST", uri);
       request.fields['api_key'] = apiKey;
       request.fields['api_secret'] = apiSecret;
       request.files.add(await http.MultipartFile.fromPath('image_file1', first.path, contentType: new MediaType('application', 'x-tar')));
       request.files.add(await http.MultipartFile.fromPath('image_file2', second.path, contentType: new MediaType('application', 'x-tar')));
       var response = await request.send();
       print(response);

但它会返回这个

NoSuchMethodError: 类 'String' 没有实例 getter 'path'。

我怎样才能正确发送这些?

【问题讨论】:

    标签: dart flutter


    【解决方案1】:
    import 'dart:io';
    import 'package:http/http.dart' as http;
    import 'package:path/path.dart';
    
    class Post {
      String title = '';
      String description = '';
      List<File> files = [];
    
      Future<http.StreamedResponse> sendFiles() async {
        try {
          var uri = Uri.parse('https://example.com/api-endpoint');
          var request = http.MultipartRequest('POST', uri);
    
          // Headers
          request.headers.addAll({
            'Accept': 'application/json',
            'Authorization': 'Bearer $token',
          });
    
          // Fields
          request.fields['title'] = title;
          request.fields['description'] = description;
    
          // Files
          await Future.forEach(
            files,
            (file) async => {
              request.files.add(
                http.MultipartFile(
                  'files',
                  (http.ByteStream(file.openRead())).cast(),
                  await file.length(),
                  filename: basename(file.path),
                ),
              )
            },
          );
    
          return await request.send();
        } catch (err) {
          print(err);
    
          return null;
        }
      }
    }
    

    【讨论】:

    • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助、质量更好,并且更有可能吸引投票
    【解决方案2】:

    看起来firstsecond 实际上不是Files。当它们肯定是文件时,如下例所示,我得到 401(正如预期的那样,因为我有一个虚拟 api 密钥)。

    main() async {
      File first = File('pubspec.yaml');
      File second = File('analysis_options.yaml');
      Uri uri = Uri.parse('https://api-us.faceplusplus.com/facepp/v3/compare');
      http.MultipartRequest request = new http.MultipartRequest('POST', uri);
      request.fields['api_key'] = 'apiKey';
      request.fields['api_secret'] = 'apiSecret';
      request.files.add(await http.MultipartFile.fromPath('image_file1', first.path,
          contentType: new MediaType('application', 'x-tar')));
      request.files.add(await http.MultipartFile.fromPath(
          'image_file2', second.path,
          contentType: new MediaType('application', 'x-tar')));
      http.StreamedResponse response = await request.send();
      print(response.statusCode);
    }
    

    【讨论】:

    • @jay 最好把这个问题当作你自己的问题来问
    • @MoVod 抱歉,我应该删除它。
    猜你喜欢
    • 2019-04-08
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    相关资源
    最近更新 更多