如何在flutter中保存下载文件夹中的文件?

tvokkenx  于 2022-12-19  发布在  Flutter
关注(0)|答案(4)|浏览(322)

在我的flutter应用程序中,我可以创建一个pdf文件,然后我想将其保存在下载文件夹中。我试图用path_provider包来实现这个目标,但我不能。
这是flutter的cookbook中的示例代码,如果我使用它,我不会得到任何错误,但我也找不到文件。

final directory = await getApplicationDocumentsDirectory();
File file2 = File("${directory.path}/test.txt");
await file2.writeAsString('TEST ONE');

正确的做法是什么?

lskq00tm

lskq00tm1#

要查找正确的路径,请使用ext_storage。您将需要此权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

在Android 10上,您需要在清单中包含此信息

<application
      android:requestLegacyExternalStorage="true"

在Android 11上,请使用此选项

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

请记住使用permission_handler请求它们
我给你我的代码:

static Future saveInStorage(
      String fileName, File file, String extension) async {
    await _checkPermission();
    String _localPath = (await ExtStorage.getExternalStoragePublicDirectory(
        ExtStorage.DIRECTORY_DOWNLOADS))!;
    String filePath =
        _localPath + "/" + fileName.trim() + "_" + Uuid().v4() + extension;

    File fileDef = File(filePath);
    await fileDef.create(recursive: true);
    Uint8List bytes = await file.readAsBytes();
    await fileDef.writeAsBytes(bytes);
  }
sr4lhrrt

sr4lhrrt2#

您需要getExternalStorageDirectories。您可以传递一个参数来具体指定下载:

final directory = (await getExternalStorageDirectories(type: StorageDirectory.downloads)).first!;

File file2 = File("${directory.path}/test.txt");
await file2.writeAsString('TEST ONE');

如果使用null safety,则不需要bang运算符:

final directory = (await getExternalStorageDirectories(type: StorageDirectory.downloads)).first;

File file2 = File("${directory.path}/test.txt");
await file2.writeAsString('TEST ONE');
rwqw0loc

rwqw0loc3#

Android 11改变了很多东西,它强调了作用域存储。虽然/storage/emulated/0/Android/data/com.my.app/files是由path_provider pkg指定的目录路径之一,但如果只使用任何普通的文件应用程序(Google Files、Samsung My Files等),你将无法查看保存在/storage/emulated/0/Android/data/com.my.app/files中的文件。
解决这个问题的一个方法(尽管它只适用于Android)是指定“通用”下载文件夹,如下所示。

Directory generalDownloadDir = Directory('/storage/emulated/0/Download');

如果您将试图保存任何文件写入该目录,它将显示在任何标准文件管理器应用程序的Downloads文件夹中,而不仅仅是path_provider pkg提供的特定于应用程序的目录。
下面是我正在开发的一个应用程序的一些测试代码,我将用户生成的QR码保存到用户的设备上。

//this code "wraps" the qr widget into an image format
                          RenderRepaintBoundary boundary = key.currentContext!
                              .findRenderObject() as RenderRepaintBoundary;
                          //captures qr image 
                          var image = await boundary.toImage();

                          String qrName = qrTextController.text;
                          
                          ByteData? byteData =
                              await image.toByteData(format: ImageByteFormat.png);
                          Uint8List pngBytes = byteData!.buffer.asUint8List();

                          //general downloads folder (accessible by files app) ANDROID ONLY
                          Directory generalDownloadDir = Directory('/storage/emulated/0/Download'); //! THIS WORKS for android only !!!!!! 

                          //qr image file saved to general downloads folder
                          File qrJpg = await File('${generalDownloadDir.path}/$qrName.jpg').create();    
                          await qrJpg.writeAsBytes(pngBytes);

                          Fluttertoast.showToast(msg: ' $qrName QR code was downloaded to ' + generalDownloadDir.path.toString(), gravity: ToastGravity.TOP);
olmpazwi

olmpazwi4#

对于下载文件夹中的下载文件,下面是一些示例:

// Save multiple files
DocumentFileSave.saveMultipleFiles([textBytes, textBytes2], ["text1.txt", "text2.txt"], ["text/plain", "text/plain"]);

//Save single text file
DocumentFileSave.saveFile(textBytes, "my_sample_file.txt", "text/plain");

//Save single pdf file
DocumentFileSave.saveFile(pdfBytes, "my_sample_file.pdf", "appliation/pdf");

//Save single image file
DocumentFileSave.saveFile(imageJPGBytes, "my_sample_file.jpg", "image/jpeg");

有关库的更多详细信息,请单击此处:https://pub.dev/packages/document_file_save_plus

相关问题