我正在尝试将图像从资产保存到内部存储。但是,我无法将图像从资产加载到文件。以下是我所做的:
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);
这里有一些链接,真的帮助了我:
- Flutter How to save Image file to new folder in gallery?
- How to Save Image File in Flutter ? File selected using Image_picker plugin
- How to convert asset image to File?
特别感谢@大卫的帮助。请参阅评论,以了解完整的场景,如果你在这里解决你的类似问题。
所以,我接受了@大卫的回答。
2条答案
按热度按时间eoigrqb61#
您试图在不存在的路径中创建文件对象。您使用的是资产路径,即相对于Flutter项目根的路径。但是,此路径在设备的文档文件夹中不存在,因此无法在其中创建文件。该文件也不存在于assets文件夹中,因为您正在前置文档路径。
要解决这个问题,您应该将
assetName
传递给rootBundle.load()
,而不带文档路径,并在类似$documentPath/foo.jpg
的位置打开File()
编辑:要创建文件,你仍然需要调用
File.create
,所以你需要运行:eoxn13cs2#
为了将来的参考,这只是为了更新@Biplove的解决方案,作为一个新手,它确实帮助了我很多。
谢谢.