dart 如何保存图像从资产到内部存储在flutter?

w1jd8yoj  于 2023-10-13  发布在  Flutter
关注(0)|答案(2)|浏览(105)

我正在尝试将图像从资产保存到内部存储。但是,我无法将图像从资产加载到文件。以下是我所做的:

onTap: () async {
  
  final String documentPath = (await getApplicationDocumentsDirectory()).path;
  String imgPath = (galleryItems[currentIndex].assetName).substring(7);
  File image = await getImageFileFromAssets(imgPath);

  print(image.path);
}

我使用substring(7)来消除assets/,我的assetName为assets/images/foo.jpg

Future<File> getImageFileFromAssets(String path) async {
  final byteData = await rootBundle.load('assets/$path');

  final file =
      await File('${(await getApplicationDocumentsDirectory()).path}/$path')
          .create(recursive: true);
  await file.writeAsBytes(byteData.buffer
      .asUint8List(byteData.offsetInBytes, byteData.lengthInBytes));

  return file;
}

在我得到image之后,我不知道如何继续在内部存储中创建一个以我的名字命名的目录。把文件复制到那里。

  • 注:-我已经编辑了这篇文章,因为一些基本的错误被指出。

更新

这是我的想法。它将图像保存在/storage/emulated/0/Android/data/com.example.my_project/files/Pics/foo.jpg路径中。

File image = await getImageFileFromAssets(imgPath);

final extDir = await getExternalStorageDirectory();

// Path of file
final myImagePath = '${extDir.path}/Pics';

// Create directory inside where file will be saved
await new Directory(myImagePath).create();

// File copied to ext directory.
File newImage =
    await image.copy("$myImagePath/${basename(imgPath)}");

print(newImage.path);

这里有一些链接,真的帮助了我:

特别感谢@大卫的帮助。请参阅评论,以了解完整的场景,如果你在这里解决你的类似问题。
所以,我接受了@大卫的回答。

eoigrqb6

eoigrqb61#

您试图在不存在的路径中创建文件对象。您使用的是资产路径,即相对于Flutter项目根的路径。但是,此路径在设备的文档文件夹中不存在,因此无法在其中创建文件。该文件也不存在于assets文件夹中,因为您正在前置文档路径。
要解决这个问题,您应该将assetName传递给rootBundle.load(),而不带文档路径,并在类似$documentPath/foo.jpg的位置打开File()
编辑:要创建文件,你仍然需要调用File.create,所以你需要运行:

final file = await File('$documentPath/images/foo.jpg').create(recursive: true);
eoxn13cs

eoxn13cs2#

为了将来的参考,这只是为了更新@Biplove的解决方案,作为一个新手,它确实帮助了我很多。

Future<File> getImageFileFromAssets(String unique, String filename) async {
  ByteData byteData = await rootBundle.load(assets/filename));

  // this creates the file image
  File file = await File('$imagesAppDirectory/$filename').create(recursive: true); 

  // copies data byte by byte
  await file.writeAsBytes(byteData.buffer.asUint8List(byteData.offsetInBytes, byteData.lengthInBytes));
  
  return file;
}

谢谢.

相关问题