【问题标题】:Flutter: How to convert URI to File?Flutter:如何将 URI 转换为文件?
【发布时间】:2019-06-23 12:42:16
【问题描述】:

我想将路径“content://media/external/images/media/138501”转换为文件并在图片中设置。

代码:

File imageFile = File("content://media/external/images/media/138501");

没有工作:

DecorationImage(image: ExactAssetImage(imageFile.path),fit: BoxFit.fill)

【问题讨论】:

标签: flutter


【解决方案1】:

您可以使用uri_to_file 包。它支持 content:// URI。

使用简单(更新)

import 'package:uri_to_file/uri_to_file.dart';

try {
  String uriString = 'content://sample.txt';

  // Don't pass uri parameter using [Uri] object via uri.toString().
  // Because uri.toString() changes the string to lowercase which causes this package to misbehave

  // If you are using uni_links package for deep linking purpose.
  // Pass the uri string using getInitialLink() or linkStream

  File file = await toFile(uriString);
} on UnsupportedError catch (e) {
  print(e.message);
} on IOException catch (e) {
  print(e);
} catch (e) {
  print(e);
}

那么你可以随意使用这个文件

重要提示

不要这样传递uri值

File file = await toFile(uri.toString());

如果您使用uni_links 包进行深度链接,请像这样使用。使用 getInitialLink() 或 linkStream

String? uriString = await getInitialLink();
if (uriString != null) {
  File file = await toFile(uriString);
}

linkStream.listen((uriString) async {
  if (uriString != null) {
    File file = await toFile(uriString!);
  }
});

这不会修改 uri 字符串,因为我们没有使用 uri.toString()

所以这个包可以正常工作

工作示例: Working example

更多详情:uri_to_file

【讨论】:

  • 为我工作,flutter_absolute_path 有问题。这解决了我的问题。谢谢
  • 得到错误:无法获取文件名。
  • 嗨@PromlertLovichit。 “出现错误:无法获取文件名”这个问题现已修复,也更新了答案您可以使用最新的 uri_to_file:0.2.0 只要确保按照更新的答案中给出的正确传递 uri 字符串值
【解决方案2】:

您可以使用Image.file 构造函数。

DecorationImage(
  image: Image.file(File("content://media/external/images/media/138501")),
  fit: BoxFit.fill
)

请注意:在 Android 上,这可能需要android.permission.READ_EXTERNAL_STORAGE 权限。

【讨论】:

  • 我也试过了,但是代码不起作用。我从 Asset.dart 对象中获取了“content://medi...”路径并尝试转换为文件。似乎flutter不接受将上面的URL直接转换为文件。
【解决方案3】:

你可以使用Absolute path插件。

final filePath = await FlutterAbsolutePath.getAbsolutePath(uriString);

然后使用Image.file显示图像:

Image.file(
    File(filePath),
);

【讨论】:

    【解决方案4】:

    使用 flutter_absolute_path 包。 flutter_absolute_path: ^1.0.6 在 pubsec.yaml 中

    从这种格式转换文件路径:“content://media/external/images/media/5275” To "/storage/emulated/0/DCIM/Camera/IMG_00124.jpg”

    final filePath = await FlutterAbsolutePath.getAbsolutePath("Any path 
       here");
    
    File tempFile = File(filePath);
    
        if (tempFile.existsSync()) {
          //add your logic here.
       }
    

    【讨论】:

      【解决方案5】:

      定义你的URL:

      final url = "Your Image Url";

      然后在flutter 中将Image Url 转换为File

      XFile _xFile = XFile(url);

      完成。

      【讨论】:

        【解决方案6】:

        根据doc,您可以使用fromUri 构造函数:File.fromUri(Uri uri)

        你的情况:

        File imageFile = File.fromUri("content://media/external/images/media/138501");
        

        【讨论】:

          【解决方案7】:

          我得到了答案。我们可以使用 ByteData 来创建 File 使用它。我们可以使用以下方法从 ByteData 中获取文件:

          Future<File> writeToFile(ByteData data, String path) {
              final buffer = data.buffer;
              return new File(path).writeAsBytes(
                  buffer.asUint8List(data.offsetInBytes, data.lengthInBytes));
            }
          

          path = 你可以使用库“path_provider”

          String dir = (await getApplicationDocumentsDirectory()).path;

          更多详情,您可以查看: https://medium.com/@wangdazhitech/flutter-read-asset-file-and-write-to-app-path-42115d4ec1b6

          【讨论】:

          • 我不明白您是如何将 '"content://media/external/images/media/13850" 转换为文件的。你有完整的例子吗?在您的 writeToFile 方法中,路径是 'content://media/external/images/media/13850' ??
          猜你喜欢
          • 1970-01-01
          • 2014-07-15
          • 2021-04-03
          • 2023-04-06
          • 2011-11-10
          • 2014-08-13
          • 1970-01-01
          • 2021-07-26
          • 2015-02-22
          相关资源
          最近更新 更多