Flutter文件支持插件file_support的使用

发布于 1周前 作者 yibo5220 来自 Flutter

Flutter文件支持插件 file_support 的使用

file_support 是一个用于处理文件操作的Flutter插件。它提供了多种功能,如将文件转换为多部分文件(multipart)、通过Base64上传文件、压缩图片以及从URL下载文件等。

功能列表

  • 获取文件名:可以从文件中提取文件名(带或不带扩展名)。
  • 转换文件为多部分文件:适用于Dio和Http请求。
  • 创建随机文件和图片:用于测试目的。
  • 提取文件信息:包括名称、类型、大小等。
  • 获取文件扩展名
  • 图像压缩
  • 文件下载:支持自定义路径和默认下载目录。

权限配置

iOS (Info.plist)

<key>NSAllowsArbitraryLoads</key>
<true/>
<key>LSSupportsOpeningDocumentsInPlace</key>
<true/>
<key>UIFileSharingEnabled</key>
<true/>

Android (AndroidManifest.xml)

<application
    android:label=""
    android:requestLegacyExternalStorage="true" <!-- 添加此行 -->
    android:icon="@mipmap/ic_launcher">
    ...
</application>

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

常用API示例

获取Multipart对象(适用于Dio)

import 'package:file_support/file_support.dart';

final multipart = await FileSupport().getMultiPartFromFile(File('path/to/your/file'));

获取文件名(不含扩展名)

final fileNameWithoutExt = FileSupport().getFileNameWithoutExtension(File('path/to/your/file'));

获取文件名(含扩展名)

final fileNameWithExt = FileSupport().getFileName(File('path/to/your/file'));

获取文件扩展名

final extension = FileSupport().getFileExtension(File('path/to/your/file'));

将文件转换为Base64格式

final base64String = await FileSupport().getBase64FromFile(File('path/to/your/file'));

从Base64字符串生成文件

final file = await FileSupport().getFileFromBase64(
    base64string: 'your_base64_string',
    name: 'filename',
    extension: '.jpg');

下载文件到自定义位置

String? androidPath = "${await FileSupport().getRootFolderPath()}/GHMC/";
File? downloadedFile = await FileSupport().downloadCustomLocation(
    url: "https://www.rmp-streaming.com/media/big-buck-bunny-360p.mp4",
    path: androidPath,
    filename: "Progress",
    extension: ".mp4",
    progress: (progress) {
        print(progress);
    });

示例应用入口点

以下是一个简单的Flutter应用示例,演示了如何初始化并使用file_support插件:

import 'package:flutter/material.dart';
import 'package:file_support/file_support.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = 'Unknown';
  final _fileSupportPlugin = FileSupport();

  @override
  void initState() {
    super.initState();
    initPlatformState();
  }

  Future<void> initPlatformState() async {
    try {
      _platformVersion = await _fileSupportPlugin.getPlatformVersion() ?? 'Unknown platform version';
    } catch (_) {
      _platformVersion = 'Failed to get platform version.';
    }
    if (!mounted) return;
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('File Support Demo')),
        body: Center(child: Text('Running on: $_platformVersion\n')),
      ),
    );
  }
}

以上就是关于file_support插件的基本介绍及其常见API的使用方法。根据实际需求选择合适的方法来处理你的文件操作任务吧!


更多关于Flutter文件支持插件file_support的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter文件支持插件file_support的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,file_support 并不是一个官方或广泛认可的插件名称。通常,Flutter 社区会使用其他更具体的插件来处理文件操作,例如 path_providerfile_pickerpermission_handler 等。不过,基于你提到的 file_support,我假设你想要一个综合性的示例,展示如何在Flutter应用中处理文件操作,包括读写文件和请求必要的权限。

以下是一个示例代码,它结合了 path_providerfile_pickerpermission_handler 插件来实现基本的文件读写功能。请注意,你需要先在你的 pubspec.yaml 文件中添加这些依赖:

dependencies:
  flutter:
    sdk: flutter
  path_provider: ^2.0.9  # 请检查最新版本
  file_picker: ^4.3.3    # 请检查最新版本
  permission_handler: ^10.2.0  # 请检查最新版本

然后运行 flutter pub get 来获取这些依赖。

示例代码

import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:file_picker/file_picker.dart';
import 'package:permission_handler/permission_handler.dart';
import 'dart:io';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: FileSupportScreen(),
    );
  }
}

class FileSupportScreen extends StatefulWidget {
  @override
  _FileSupportScreenState createState() => _FileSupportScreenState();
}

class _FileSupportScreenState extends State<FileSupportScreen> {
  late Future<String?> _localFile;

  @override
  void initState() {
    super.initState();
    _requestPermissions();
    _localFile = _getLocalFile();
  }

  Future<void> _requestPermissions() async {
    var status = await Permission.storage.status;
    if (!status.isGranted) {
      var result = await Permission.storage.request();
      if (!result.isGranted) {
        // 处理权限被拒绝的情况
      }
    }
  }

  Future<String?> _getLocalFile() async {
    final directory = await getApplicationDocumentsDirectory();
    final file = File('${directory.path}/example.txt');
    
    // 尝试读取文件内容
    if (await file.exists()) {
      return file.readAsString();
    } else {
      // 如果文件不存在,写入一些内容
      await file.writeAsString('Hello, Flutter File Support!');
      return file.readAsString();
    }
  }

  Future<void> _pickFile() async {
    final result = await FilePicker.platform.pickFiles(
      type: FileType.any,
    );

    if (result != null) {
      final file = File(result.files.single.path!);
      // 这里可以添加对选中文件的处理逻辑
      print('Selected file: ${file.path}');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter File Support Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            FutureBuilder<String?>(
              future: _localFile,
              builder: (context, snapshot) {
                if (snapshot.connectionState == ConnectionState.done) {
                  if (snapshot.hasError) {
                    return Text('Error: ${snapshot.error}');
                  } else if (snapshot.data == null) {
                    return Text('No data available.');
                  } else {
                    return Text('File Content:\n${snapshot.data!}');
                  }
                } else {
                  return CircularProgressIndicator();
                }
              },
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _pickFile,
              child: Text('Pick a File'),
            ),
          ],
        ),
      ),
    );
  }
}

解释

  1. 权限请求:在 _requestPermissions 方法中,我们请求存储权限。这是处理文件读写所必需的。

  2. 本地文件操作:在 _getLocalFile 方法中,我们使用 path_provider 获取应用的文档目录,并尝试读取或创建一个名为 example.txt 的文件。

  3. 文件选择器_pickFile 方法使用 file_picker 插件让用户从设备中选择一个文件。

  4. UI:在 build 方法中,我们使用 FutureBuilder 来异步加载并显示本地文件的内容,并提供一个按钮让用户选择文件。

这个示例展示了如何在Flutter应用中处理基本的文件操作,包括请求权限、读写本地文件和选择文件。你可以根据需要扩展和修改这个示例。

回到顶部