5
votes

I want to copy the image to the application directory, but I always get this error:

[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)

I want to copy this image, to be sure, when I save it, that the user is not deleting an important file. This file I wanted to store inside the database.

This is the code where I copy the image, that was taken with image_picker:

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

I hope somebody is able to solve my problem.

2

2 Answers

13
votes

path is the directory /data/user/0/com.vendetta.recipe/app_flutter. Try adding a /filename.jpg to it.

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

Please try this then your problem is resolved

I have provided to you can also copy file of any extension dynamically

Follow these steps -

1.First add this import

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

2.Get file name with extension

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

3.Then pass the extension to the

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

4.Then Write this method

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. Then you will get expected result