如何在颤动中将 List<Asset> 转换为 List<File>

Posted

技术标签:

【中文标题】如何在颤动中将 List<Asset> 转换为 List<File>【英文标题】:How to convert List<Asset> to List<File> in flutter 【发布时间】:2020-06-14 10:59:29 【问题描述】:

我正在使用this package 从图库中获取多个图像,它返回一个资产列表,现在我想将其发送到服务器,我使用 FormDate 但需要图像路径。

    还有其他方法可以将资产图片发送到服务器吗?

    如何将List&lt;Asset&gt; 转换为List&lt;File&gt;

    如何从资产

    获取图片路径

或任何其他方法来完成此任务(从存储中选择多个图像并将它们发送到服务器)。

List<Asset> images = List<Asset>();

FormData imageFormData = FormData.fromMap(
  "files": images.map((image) async 
     return await MultipartFile.fromFile('assets/$image.name', filename: image.name);
     ).toList(),
);

【问题讨论】:

使用MultipartRequest @Naeem 如果您找到答案,请在下面发布,我也使用相同的多图像选择器库,可以吗? 【参考方案1】:

我认为您可以在发送之前将资产文件作为文件读取,如下所示:

File imageFile = File('yourAssetsUriPath.jpg');
yourAssetsUriPath 默认指向您的资产文件夹,因此您只需将文件名放在路径中即可。

http 发帖可以参考here

【讨论】:

【参考方案2】:

利用flutter_absolute_path包。

在 pubsec.yaml 中添加 flutter_absolute_path: ^1.0.6

这将转换此格式的文件路径:“content://media/external/images/media/5275” 到这种格式(绝对格式) “/storage/emulated/0/DCIM/Camera/IMG_00124.jpg”

那就利用这个方法:

未来 imagePicker() 异步

List<Asset> assetArray = [];
List <File> fileImageArray = [];

try 
    assetArray = await MultiImagePicker.pickImages(
        maxImages: 300,
        enableCamera: true,
        selectedAssets:  assetArray ,
        cupertinoOptions: CupertinoOptions(takePhotoIcon: "chat"),
        materialOptions: MaterialOptions(
            actionBarColor: "",
            actionBarTitle: "ImagePicker",
            allViewTitle: "All Photos",
            useDetailsView: false,
            selectCircleStrokeColor: "#000000",
            ),
        );
on Exception catch (e) 
    print( e.toString());


assetArray.forEach((imageAsset) async 
    final filePath = await FlutterAbsolutePath.getAbsolutePath(imageAsset.identifier);
    
    File tempFile = File(filePath);
    if (tempFile.existsSync()) 
        fileImageArray.add(tempFile);
    
);

return fileImageArray;

【讨论】:

【参考方案3】:

这是解决方案。

List<Asset> images = List<Asset>();
List<MultipartFile> multipart = List<MultipartFile>();
for (int i = 0; i < images.length; i++) 
  var path = await FlutterAbsolutePath.getAbsolutePath(images[i].identifier);
  multipart.add(await MultipartFile.fromFile(path, filename: 'myfile.jpg'));

FormData imageFormData = FormData.fromMap("files": multipart,);

【讨论】:

以上是关于如何在颤动中将 List<Asset> 转换为 List<File>的主要内容,如果未能解决你的问题,请参考以下文章

如何在颤动中将 json 数据转换为 List<widgets>?

如何在颤动中将 List<String> 转换为 String [重复]

如何在颤动中将 Map<String, List<object>> 保存在 sharedPreferences 中?

如何在颤动中将对象编码为 Json

如何在颤动的Listview中显示字符串列表

如何在颤动中将格式从列表视图更改为网格视图?