Flutter大文件上传插件large_file_uploader的使用

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

Flutter大文件上传插件large_file_uploader的使用

1 - 依赖它

在你的项目的pubspec.yaml文件中添加以下依赖:

dependencies:
  large_file_uploader: ^0.0.7

2 - 安装它

从命令行安装包:

flutter pub get

3 - 导入它

在你的项目中导入该库:

import 'package:large_file_uploader/large_file_uploader.dart';

4 - 复制它

upload_worker.js复制到项目的public文件夹中。

如何使用?

简单用法
LargeFileUploader().selectFileAndUpload(
    uploadUrl: 'https://baseurl.com/upload-path',
    data: {
      'title': 'My image', // 额外要发送的字段
    },
    headers: {
      'Authorization': 'Bearer <accessToken>', 
    },
    onSendProgress: (progress) => debugPrint('onSendProgress:$progress'),
    onComplete: () => debugPrint('onComplete'),
    onFailure: () => debugPrint('onFailure'),
);
高级用法
import 'dart:html' as html;
import 'package:large_file_uploader/large_file_uploader.dart';

...

final _largeFileUploader = LargeFileUploader();
html.File? file; 
html.File? thumbnail;

_largeFileUploader.pick(
      type: FileTypes.video, 
      callback: (file) {
        pickedThumbnail = file;
      },
);

_largeFileUploader.pick(
      customType: 'image/jpeg', 
      callback: (file) {
        thumbnail = file;
      },
);

if(file != null){
  _largeFileUploader.upload(
      uploadUrl: url,
      headers: {"Authorization": "Bearer <accessToken>"},
      data: {"title": "My Image", "thumbnail": thumbnail, "file": file},
      onSendProgress: (progress) => debugPrint(progress.toString()),
      onComplete: (response) => debugPrint(response.toString()),
  );
}

示例代码

以下是一个完整的示例代码,展示了如何使用large_file_uploader插件进行大文件上传:

import 'dart:html' as html;

import 'package:flutter/material.dart';
import 'package:large_file_uploader/large_file_uploader.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 UploadExample(),
    );
  }
}

class UploadExample extends StatefulWidget {
  const UploadExample({Key? key}) : super(key: key);

  [@override](/user/override)
  State<UploadExample> createState() => _UploadExampleState();
}

class _UploadExampleState extends State<UploadExample> {
  late final LargeFileUploader _largeFileUploader;

  html.File? pickedFile;
  html.File? pickedThumbnail;

  bool isFileSelected = false;
  bool isThumbnailSelected = false;

  final accessToken = '';
  final url = '';

  [@override](/user/override)
  void initState() {
    _largeFileUploader = LargeFileUploader();
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: SizedBox(
        width: double.maxFinite,
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
                onPressed: () {
                  _largeFileUploader.pick(
                      type: FileTypes.file,
                      callback: (file) {
                        setState(() {
                          pickedFile = file;
                          isFileSelected = false;
                        });
                      });
                },
                child: const Text("选择并上传文件")),
            const SizedBox(
              height: 8,
            ),
            if (isFileSelected)
              const Text(
                "你需要先选择一个文件",
                style: TextStyle(color: Colors.red),
              ),
            const SizedBox(
              height: 8,
            ),
            ElevatedButton(
                onPressed: () {
                  _largeFileUploader.pick(
                      type: FileTypes.image,
                      callback: (file) {
                        setState(() {
                          pickedThumbnail = file;
                          isThumbnailSelected = false;
                        });
                      });
                },
                child: const Text("选择缩略图")),
            const SizedBox(
              height: 8,
            ),
            if (isThumbnailSelected)
              const Text(
                "你需要先选择一个缩略图",
                style: TextStyle(color: Colors.red),
              ),
            const SizedBox(
              height: 8,
            ),
            ElevatedButton(
                onPressed: () {
                  if (pickedFile != null && pickedThumbnail != null) {
                    _largeFileUploader.upload(
                      uploadUrl: url,
                      headers: {"Authorization": "Bearer $accessToken"},
                      data: {"title": "Sample Title", "thumbnail": pickedThumbnail, "file": pickedFile},
                      onSendProgress: (progress) => debugPrint(progress.toString()),
                      onComplete: (response) => debugPrint(response.toString()),
                    );

                    setState(() {
                      isFileSelected = false;
                      isThumbnailSelected = false;
                    });
                  } else {
                    setState(() {
                      isFileSelected = true;
                      isThumbnailSelected = true;
                    });
                  }
                },
                child: const Text("上传所选文件")),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter应用中使用large_file_uploader插件进行大文件上传的代码示例。

首先,确保你的Flutter项目中已经添加了large_file_uploader依赖。在pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  large_file_uploader: ^最新版本号  # 请替换为实际的最新版本号

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

接下来,你可以在Flutter应用中使用LargeFileUploader类进行大文件上传。以下是一个完整的示例,展示了如何配置和使用large_file_uploader插件:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Large File Uploader Example'),
        ),
        body: Center(
          child: UploadFileButton(),
        ),
      ),
    );
  }
}

class UploadFileButton extends StatefulWidget {
  @override
  _UploadFileButtonState createState() => _UploadFileButtonState();
}

class _UploadFileButtonState extends State<UploadFileButton> {
  final LargeFileUploader _uploader = LargeFileUploader();

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: () async {
        // 选择文件
        var file = await pickFile();
        if (file != null) {
          // 配置上传参数
          var uploadConfiguration = UploadConfiguration(
            url: 'https://your-upload-endpoint.com/upload', // 替换为你的上传URL
            file: file,
            headers: {
              'Authorization': 'Bearer your-token', // 替换为你的认证token(如果需要)
            },
            onProgress: (progress) {
              // 更新上传进度
              print('Upload progress: ${progress.progress}%');
            },
            onComplete: (response) {
              // 上传完成后的处理
              print('Upload complete: ${response.body}');
            },
            onError: (error) {
              // 上传错误处理
              print('Upload error: $error');
            },
          );

          // 开始上传
          _uploader.upload(uploadConfiguration);
        }
      },
      child: Text('Upload File'),
    );
  }

  // 选择文件的函数(这里使用file_picker插件作为示例)
  Future<File?> pickFile() async {
    final result = await FilePicker.platform.pickFiles(
      type: FileType.any,
      allowMultiple: false,
    );
    if (result != null) {
      return File(result.files.single.path!);
    } else {
      return null;
    }
  }
}

注意:

  1. 上面的示例使用了file_picker插件来选择文件。你需要在pubspec.yaml中添加file_picker依赖,并运行flutter pub get来安装它。
  2. 请确保将url替换为你的实际上传端点,并根据需要配置headers
  3. 如果你的上传端点需要认证,请在headers中添加相应的认证信息。

这是一个基本的示例,你可以根据实际需求进行扩展和修改。希望这对你有所帮助!

回到顶部