未处理的异常:内容大小小于指定的contentLength。写入206字节,但预期为375482.#228

时间:2019-08-23 20:08:49

标签: flutter dart

我正在尝试使用带有以下代码的multi_image_picker上传多个文件,但标题中出现错误。我正在按照document中的代码进行操作,但不确定是否以正确的方式进行操作。 预先感谢

Future<void> sendDataToServer() async {
    // string to uri
    Uri uri = Uri.parse(Settings.SERVER_URL + 'api/uploadproduct');

// create multipart request
    MultipartRequest request = http.MultipartRequest("POST", uri);

    request.fields['name'] = productName;

    List.generate(images.length, (index) async {
      Asset asset = images[index];

      ByteData byteData = await asset.getByteData();
      List<int> imageData = byteData.buffer.asUint8List();

      MultipartFile multipartFile = MultipartFile.fromBytes(
        'photos',
        imageData,
        filename: 'some-file-name.jpg',
        contentType: MediaType("image", "jpg"),
      );

      // add file to multipart
      request.files.add(multipartFile);
    });

// send
    var response = await request.send();
  }

更新和解决方案

感谢@Richard Heap的答案,我可以找到一个解决方案,在这里添加解决方案,因为他的答案不是完整的解决方案:

Future<void> sendDataToServer() async {
    // string to uri
    Uri uri = Uri.parse(Settings.SERVER_URL + 'api/uploadproduct');

// create multipart request
    MultipartRequest request = http.MultipartRequest("POST", uri);

    request.fields['name'] = productName;

    for (var asset in images) { {
      Asset asset = images[index];

      ByteData byteData = await asset.getByteData();
      List<int> imageData = byteData.buffer.asUint8List();

      MultipartFile multipartFile = MultipartFile.fromBytes(
        'photos[]', //this [] little change was needed to make it work
        imageData,
        filename: 'some-file-name.jpg',
        contentType: MediaType("image", "jpg"),
      );

      // add file to multipart
      request.files.add(multipartFile);
    };

// send
    var response = await request.send();
  }

2 个答案:

答案 0 :(得分:1)

List.generate更改为:

  var i = 0;
  for (var asset in images) {
    i++;
    var multipartFile = MultipartFile.fromBytes(
      'photo$i',
      (await asset.getByteData()).buffer.asUint8List(),
      filename: 'photo$i.jpg', // use the real name if available, or omit
      contentType: MediaType('image', 'jpg'),
    );

    request.files.add(multipartFile);
  }

这将导致编号为photo1photo2等的参数。

您添加[]的技巧可能仅适用于基于PHP的服务器,该服务器知道后缀表示称为photos的参数数组。单独编号的方法更为通用。

答案 1 :(得分:0)

我遇到了同样的问题

 Files.forEach((val) async{
  var MyFile = await http.MultipartFile.fromPath('MediaFiles[]',val);
  Multi.files.add(
    MyFile,
  );
});

我只将“ forEach”更改为“ for”循环,并为我工作。

工作代码

for(var val in Files){
  var MyFile = await http.MultipartFile.fromPath('MediaFiles[]',val);
  Multi.files.add(
    MyFile,
  );
}