Flutter图片上传功能插件flutter_image_uploading的使用

Flutter 图片上传功能插件 flutter_image_uploading 的使用

特性

通过使用此插件,我们可以轻松地从相册、文件管理器或相机中选择文件,并请求用户权限。

  • 使用此插件时,可以获取用户同意从相册获取图片或从相机拍摄的图片。
  • 您还可以获取文档文件。

开始使用

Android

在您的 <b>AndroidManifest.xml</b> 文件中添加权限。通常情况下,只需要向主版本添加权限即可。

<!-- Permissions options for the `storage` group -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<!-- Permissions options for the `camera` group -->
<uses-permission android:name="android.permission.CAMERA"/>

iOS

在您的 <b>Info.plist</b> 文件中添加权限。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
   <key>NSCameraUsageDescription</key>
   <string>允许访问摄像头以拍摄照片</string>
   
   <key>NSPhotoLibraryUsageDescription</key>
   <string>允许访问照片库以选择照片</string>
</dict>
</plist>

在您的 Podfile 文件中添加以下内容:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    flutter_additional_ios_build_settings(target)

    target.build_configurations.each do |config|
      # You can remove unused permissions here
      # for more information: https://github.com/BaseflowIT/flutter-permission-handler/blob/master/permission_handler/ios/Classes/PermissionHandlerEnums.h
      # e.g. when you don't need camera permission, just add 'PERMISSION_CAMERA=0'
      config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
        '$(inherited)',

        ## dart: PermissionGroup.camera
        'PERMISSION_CAMERA=1',
        ## dart: PermissionGroup.photos
        'PERMISSION_PHOTOS=1'
      ]
    end
  end
end

使用方法

调用以下函数:

void getImageFile() {
  ImageHelper().showPhotoBottomDialog(context, Platform.isIOS, (file) {
    setState(() {
      print("File=${file.toString()}");
      this.file = file;
    });
  },
  fileFormat: FileFormat.image, // 默认为图片
  );
}

如果您要上传视频,则可以将 fileFormat 设置为 FileFormat.video

完整示例代码

以下是一个完整的示例代码,展示了如何使用该插件实现图片上传功能。

import 'dart:io';

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

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  File? file;

  void getImageFile() {
    ImageHelper().showPhotoBottomDialog(context, Platform.isIOS, (file) {
      setState(() {
        print("File=${file.toString()}");
        this.file = file;
      });
    },
    fileFormat: FileFormat.image,
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Container(
              child: Text("File name = ${file?.path ?? ''}"),
            )
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: getImageFile,
        tooltip: '上传',
        child: const Icon(Icons.upload_file),
      ),
    );
  }
}

更多关于Flutter图片上传功能插件flutter_image_uploading的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter图片上传功能插件flutter_image_uploading的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_image_uploading 是一个用于在 Flutter 应用中实现图片上传功能的插件。它允许用户从设备中选择图片并将其上传到指定的服务器。以下是如何使用 flutter_image_uploading 插件的基本步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 flutter_image_uploading 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_image_uploading: ^1.0.0  # 请检查最新版本

然后运行 flutter pub get 来安装依赖。

2. 导入插件

在需要使用图片上传功能的 Dart 文件中导入插件:

import 'package:flutter_image_uploading/flutter_image_uploading.dart';

3. 初始化图片上传器

在你的代码中初始化 ImageUploader 实例:

final imageUploader = ImageUploader();

4. 选择并上传图片

使用 ImageUploaderpickAndUploadImage 方法来选择图片并上传到服务器。你需要提供一个上传 URL 和上传完成后的回调函数。

void uploadImage() async {
  try {
    final response = await imageUploader.pickAndUploadImage(
      uploadUrl: 'https://your-server.com/upload', // 替换为你的上传 URL
      fieldName: 'file', // 上传文件的字段名
      headers: {
        'Authorization': 'Bearer your_token', // 如果需要认证
      },
      onProgress: (progress) {
        print('Upload progress: $progress%');
      },
    );

    if (response.statusCode == 200) {
      print('Upload successful: ${response.body}');
    } else {
      print('Upload failed: ${response.statusCode}');
    }
  } catch (e) {
    print('Error uploading image: $e');
  }
}

5. 触发上传

你可以在按钮点击事件中调用 uploadImage 方法:

ElevatedButton(
  onPressed: uploadImage,
  child: Text('Upload Image'),
);

6. 处理服务器响应

onProgress 回调中,你可以处理上传进度。上传完成后,response 对象包含服务器返回的状态码和响应体。

7. 错误处理

在上传过程中可能会遇到各种错误,例如网络问题、服务器错误等。确保在 try-catch 块中捕获并处理这些错误。

8. 自定义配置

flutter_image_uploading 插件还提供了其他配置选项,例如设置超时时间、限制文件大小、限制文件类型等。你可以根据需要进行配置。

final imageUploader = ImageUploader(
  maxFileSize: 5 * 1024 * 1024, // 限制文件大小为 5MB
  allowedExtensions: ['jpg', 'png'], // 只允许上传 JPG 和 PNG 文件
  timeout: Duration(seconds: 30), // 设置超时时间为 30 秒
);

9. 清理资源

如果你不再需要 ImageUploader 实例,可以调用 dispose 方法来释放资源:

imageUploader.dispose();

10. 示例代码

以下是一个完整的示例代码:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Image Upload Example')),
        body: Center(
          child: ImageUploaderWidget(),
        ),
      ),
    );
  }
}

class ImageUploaderWidget extends StatelessWidget {
  final imageUploader = ImageUploader();

  void uploadImage() async {
    try {
      final response = await imageUploader.pickAndUploadImage(
        uploadUrl: 'https://your-server.com/upload',
        fieldName: 'file',
        headers: {
          'Authorization': 'Bearer your_token',
        },
        onProgress: (progress) {
          print('Upload progress: $progress%');
        },
      );

      if (response.statusCode == 200) {
        print('Upload successful: ${response.body}');
      } else {
        print('Upload failed: ${response.statusCode}');
      }
    } catch (e) {
      print('Error uploading image: $e');
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: uploadImage,
      child: Text('Upload Image'),
    );
  }
}
回到顶部