Flutter 本地文件操作

本文介绍了如何在Flutter应用中使用Future实现数据的缓存写入和从文件中读取,通过`writeCache`和`readCache`方法处理关键路径和错误处理。展示了如何利用`getFilePath`获取不同类型的文件路径并创建或检查其存在。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


// 缓存接口数据
Future<dynamic> writeCache(type, data) async {
  // 获取路径
  var _filePath = await getFilePath(type);
  File _file = new File('$path/appointment');
  await _file.writeAsStringSync(data.toString());
  return;
}

// 从文件中读取数据
Future<String> readCache(fileName) async {
  // 数据缓存文件夹路径
  String _filePath = await getFilePath('storage');
  try {
    File _file = File('$_filePath/$fileName');
    // Read the file
    String contents = await _file.readAsStringSync();
    return contents;
  } catch (e) {
    print('error: $e');
    return '';
  }
}

// 获取app临时文件路径
Future getFilePath(type) async{
    var filepath = await getApplicationDocumentsDirectory(); // App内部file:data.com.nufang.zao/app-flutter/
    // var filepath = await getTemporaryDirectory();        // App内部file:data.com.nufang.zao/ache/
    // var filepath = await getExternalStorageDirectory();  // App内部file:data.com.nufang.zao/file/

    var file = Directory(filepath.path + '/$type');
    try {
      bool exists = await file.exists();
      if (!exists) {
        await file.create();
      }
    } catch (e) {
      print(e);
    }
    return file.path;
}

### 如何在 Flutter 中实现上传本地文件功能 #### 创建 Dart 类处理文件选择和上传逻辑 为了实现在 Flutter 中上传本地文件的功能,需要创建一个专门负责此任务的 Dart 文件 `file_uploader.dart`。该文件不仅会管理文件的选择还会通过 HTTP 请求完成实际的文件传输工作。 ```dart import 'dart:convert'; import 'dart:io'; import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import 'package:path_provider/path_provider.dart'; // 用于获取设备上的路径 import 'package:image_picker/image_picker.dart'; // 用于选取图片或其他类型的文件 class FileUploader { static const String uploadUrl = "https://example.com/upload"; /// 获取临时目录并从中挑选文件 Future<File> pickFile() async { final picker = ImagePicker(); PickedFile pickedFile; try { pickedFile = await picker.getImage(source: ImageSource.gallery); } catch (e) { throw Exception("Failed to select file"); } if (pickedFile != null && pickedFile.path.isNotEmpty) { return File(pickedFile.path); } throw Exception("No file selected."); } /// 将选定的文件上传至服务器 Future<void> upload(File file, String fileName) async { var request = http.MultipartRequest('POST', Uri.parse(uploadUrl)); request.files.add(await http.MultipartFile.fromPath( 'file', file.path, filename: fileName)); var response = await request.send(); if(response.statusCode == 200){ debugPrint("Upload successful!"); }else{ debugPrint("Error during upload ${response.reasonPhrase}"); } } } ``` 上述代码展示了如何利用第三方包 `image_picker` 来让用户从相册中选择图像作为待上传的目标文件[^1]。同时借助于官方提供的 `http` 和 `path_provider` 插件来简化网络请求以及访问存储位置的操作。 #### 构建 UI 组件触发文件选择与上传动作 接下来,在应用程序界面部分添加按钮以便用户可以点击以启动文件选择流程,并最终执行上传命令: ```dart ElevatedButton( onPressed: () async { try { File chosenFile = await FileUploader().pickFile(); String nameOfTheFile = DateTime.now().millisecondsSinceEpoch.toString()+".jpg"; await FileUploader().upload(chosenFile,nameOfTheFile); } on Exception catch (_) { ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text("An error occurred"))); } }, child: Text('Select and Upload'), ), ``` 这段代码片段实现了当用户按下按钮时,程序将会引导他们进入图库选择一张照片,之后尝试将其上传到指定的服务端地址上。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值