Flutter - невозможно скопировать файл на новый путь

Я хочу скопировать изображение в каталог приложения, но всегда получаю такую ​​ошибку:

[ERROR:flutter/shell/common/shell.cc(181)] Dart Error: Unhandled exception: E/flutter ( 4159): FileSystemException: Cannot copy file to '/data/user/0/com.vendetta.recipe/app_flutter', path = '/storage/emulated/0/Android/data/com.vendetta.recipe/files/Pictures/a6fd32a9-60b2-4cff-8f10-2ffc2933bf751208556873045090039.jpg' (OS Error: Is a directory, errno = 21) E/flutter ( 4159): #0
_File.copy. (dart:io/file_impl.dart:340:9) E/flutter ( 4159): #1 _RootZone.runUnary (dart:async/zone.dart:1379:54) E/flutter ( 4159): #2
_FutureListener.handleValue (dart:async/future_impl.dart:129:18) E/flutter ( 4159): #3
Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:642:45) E/flutter ( 4159): #4
Future._propagateToListeners (dart:async/future_impl.dart:671:32) E/flutter ( 4159): #5 Future._completeWithValue (dart:async/future_impl.dart:486:5) E/flutter ( 4159): #6
Future._asyncComplete. (dart:async/future_impl.dart:516:7) E/flutter ( 4159): #7
_microtaskLoop (dart:async/schedule_microtask.dart:41:21) E/flutter ( 4159): #8 _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)

Я хочу скопировать это изображение, чтобы быть уверенным, что при сохранении пользователь не удаляет важный файл. Этот файл я хотел сохранить в базе данных.

Это код, в который я копирую изображение, снятое с помощью image_picker:

Directory directory = await getApplicationDocumentsDirectory();
String path = directory.path;
File newImage = await _image.copy('$path');

Надеюсь, кто-нибудь сможет решить мою проблему.

6
0
13 891
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

path - это каталог /data/user/0/com.vendetta.recipe/app_flutter. Попробуйте добавить к нему /filename.jpg.

File newImage = await _image.copy('$path/filename.jpg');

Эй, это вызывает ошибку в Android 10, errno 13, в разрешении отказано

Nithin Sai 28.11.2020 16:57

пользователю необходимо предоставить вам доступ для записи в некоторые каталоги

Jacob Phillips 29.11.2020 02:15

Подождите, вы имеете в виду, что мне нужно каждый раз запрашивать доступ пользователя к хранилищу? На данный момент я прошу разрешения при открытии приложения

Nithin Sai 29.11.2020 08:44

нет не каждый раз.

Jacob Phillips 29.11.2020 08:49

Но я получаю сообщение об ошибке, даже если я уже запросил разрешение пользователя. Решение, которое я нашел, заключалось в том, чтобы скомпилировать dk на уровне 29 и добавить "allowLegacyExternalStorage" как истинное в Android manifest.xml. Я узнал, что это связано с ограниченным хранилищем в Android 10, но как теперь использовать каталог внешнего хранилища?

Nithin Sai 30.11.2020 03:02

@NithinSai, вы нашли решение, я тоже столкнулся с этой проблемой

Adnan haider 08.09.2021 09:47

@Adnanhaider в Android 10, как я уже упоминал, вам нужно добавить устаревшую поддержку в манифест android:requestLegacyExternalStorage = "true", начиная с Android 11 и далее, вам нужно использовать хранилище с ограниченным объемом памяти. Обратитесь к документации: developer.android.com/about/versions/11/privacy/storage

Nithin Sai 08.09.2021 19:08

Пожалуйста, попробуйте это, и ваша проблема будет решена

Я предоставил вам возможность динамически копировать файл любого расширения.

Следуй этим шагам -

1. Сначала добавьте этот импорт

import 'package:path/path.dart' as path;

2. получить имя файла с расширением

 var basNameWithExtension = path.basename(sourceFile.path);

3. Затем передайте расширение в

var file =  await moveFile(sourceFile,newPath+"/"+basNameWithExtension);

4.Затем напишите этот метод

Future<File> moveFile(File sourceFile, String newPath) async {
    try {
      /// prefer using rename as it is probably faster
      /// if same directory path
      return await sourceFile.rename(newPath);
    } catch (e) {
      /// if rename fails, copy the source file 
      final newFile = await sourceFile.copy(newPath);
      return newFile;
    }
  }
  1. Тогда вы получите ожидаемый результат

Привет, это удаляет исходный файл?

Nithin Sai 30.11.2020 04:28

Пожалуйста, проверьте обновленный код.

Abhijit Rajmane 30.11.2020 08:28

я хочу использовать копирование или перемещение моего файла из одного каталога в другой, как я могу это сделать, вот мой путь к файлу '/storage/emulated/0/Android/data/com.wasisoft.topi/files/vi‌ deo1.mp4' и здесь я хочу переместить свой путь к файлу '/ storage / emulated / 0 / Download / video1. mp4 ',

Adnan haider 08.09.2021 09:50

Другие вопросы по теме