Как сохранить изображения из ассетов во внутреннее хранилище во флаттере? - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь сохранить изображение из ресурсов во внутреннюю память. Но мне не удалось загрузить изображение из ресурсов в файл. Вот что я сделал:

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/ as, мое имя 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, Я не знаю, как продолжить создание каталога с моим именем во внутренней памяти. И скопируйте туда файл.

* Примечание: - Я отредактировал сообщение, так как были отмечены некоторые основные c ошибки.

Обновление

Вот что я придумал. И он сохраняет изображение по пути /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);

Вот несколько ссылок, которые мне действительно помогли:

Особая благодарность @David за помощь. Просмотрите комментарии, чтобы понять всю сцену, если вы здесь, чтобы решить подобную проблему.

Итак, я принимаю ответ от @ David.

1 Ответ

1 голос
/ 06 августа 2020

Вы пытаетесь создать файловый объект по несуществующему пути. Вы используете свой путь к активу, путь относительно root вашего проекта Flutter. Однако этот путь не существует в папке документов устройства, поэтому файл не может быть создан там. Файл также не существует в папке с ресурсами, потому что вы добавляете путь к документам.

Чтобы исправить проблему, вы должны передать assetName в rootBundle.load() без пути к документам и открыть File() где-то вроде $documentPath/foo.jpg

Изменить: чтобы создать файл, вам все равно нужно вызвать File.create, поэтому вам нужно запустить:

final file = await File('$documentPath/images/foo.jpg').create(recursive: true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...