Flutter文件上传插件uploader的使用

Flutter文件上传插件uploader的使用

本插件用于创建AAB/APK和IPA文件,并将它们发送到Play Console、TestFlight和Firebase App Distribution。

安装

iOS
  1. 创建一个包含issuer_idauth_key的JSON文件,并将该文件的路径提供给UploaderiosConfig->path参数。
  2. issuer_id可以在App Store Connect的“用户与访问”部分获取。
  3. 对于auth_key,在同一个部分创建一个新的开发者密钥。该密钥的ID值可以用作auth_key。下载创建的密钥文件并将其放置在计算机的~/private_keys/目录下,该计算机将调用该包。

instruction

Android
  1. 配置keystore详情)。
  2. 在Google Cloud上激活Google Play Android Developer API详情)。
  3. 此链接创建一个service account。创建完service account后,从service accountKeys选项卡生成新的JSON密钥文件,并将该JSON文件的路径提供给UploaderandroidConfig->path参数。
  4. 最后,服务账户需要被授予权限。从Google Play控制台的“用户与权限”部分,向服务账户电子邮件发送具有AdminReleases权限的邀请。
Firebase App Distribution
  1. 安装Firebase CLI详情)。
  2. 在Firebase上激活App Distribution
  3. 在Firebase的设置中,通过集成选项卡与Google Play进行集成。如果应用尚未发布,则无法完成此集成,在这种情况下,UploaderandroidBuildType参数应设置为apk

使用

pubspec.yaml文件中添加依赖项:

dev_dependencies:
  uploader: any

配置Uploader参数:

uploader:
  platform: all # ios, android, all
  uploadType: all # appDistribution, store, all
  iosConfig:
    path: ios/deploy_config.json # 必须包含auth_key和issuer_id
  androidConfig:
    path: android/deploy_config.json # 必须包含client_email, client_id, private_key
    track: internal # internal, alpha, beta
    packageName: "com.package.name"
    skslPath: android/sksl.json
  appDistributionConfig:
    androidBuildType: abb # abb, apk
    androidTestersPath: android/testers.txt
    iosTestersPath: ios/testers.txt
    releaseNotesPath: release_notes.txt
    useParallelUpload: true # 默认:true
    enableLogFileCreation: false # 默认: false.
  extraBuildParameters: null

配置完成后,运行Uploader:

flutter pub run uploader

示例代码

首先,在pubspec.yaml文件中添加uploader插件:

dev_dependencies:
  uploader: any

然后,配置Uploader参数:

uploader:
  platform: all # ios, android, all
  uploadType: all # appDistribution, store, all
  iosConfig:
    path: ios/deploy_config.json # 必须包含auth_key和issuer_id
  androidConfig:
    path: android/deploy_config.json # 必须包含client_email, client_id, private_key
    track: internal # internal, alpha, beta
    packageName: "com.package.name"
    skslPath: android/sksl.json
  appDistributionConfig:
    androidBuildType: abb # abb, apk
    androidTestersPath: android/testers.txt
    iosTestersPath: ios/testers.txt
    releaseNotesPath: release_notes.txt
    useParallelUpload: true # 默认:true
    enableLogFileCreation: false # 默认: false.
  extraBuildParameters: null

最后,运行Uploader命令:

flutter pub run uploader

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

1 回复

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


当然,我可以为你提供一个关于如何使用Flutter文件上传插件 uploader 的代码示例。uploader 插件在Flutter中常用于将文件上传到服务器。下面是一个基本的示例,展示了如何使用该插件进行文件上传。

首先,确保你已经在 pubspec.yaml 文件中添加了 uploader 依赖:

dependencies:
  flutter:
    sdk: flutter
  uploader: ^x.y.z  # 请将 x.y.z 替换为最新版本号

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

接下来,编写一个完整的Flutter应用,展示如何使用 uploader 插件进行文件上传。

import 'package:flutter/material.dart';
import 'package:uploader/uploader.dart';
import 'dart:io';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter File Uploader Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: FileUploadPage(),
    );
  }
}

class FileUploadPage extends StatefulWidget {
  @override
  _FileUploadPageState createState() => _FileUploadPageState();
}

class _FileUploadPageState extends State<FileUploadPage> {
  final _formKey = GlobalKey<FormState>();
  File? _selectedFile;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('File Upload Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Form(
          key: _formKey,
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: <Widget>[
              TextFormField(
                decoration: InputDecoration(labelText: 'File URL (optional)'),
                enabled: false,  // Assuming we will use file picker for actual file
              ),
              SizedBox(height: 16),
              ElevatedButton(
                onPressed: _pickFile,
                label: Text('Choose File'),
              ),
              SizedBox(height: 16),
              if (_selectedFile != null)
                ElevatedButton(
                  onPressed: _uploadFile,
                  label: Text('Upload File'),
                ),
              SizedBox(height: 16),
              if (_selectedFile != null)
                Text('Selected File: ${_selectedFile!.path}'),
            ],
          ),
        ),
      ),
    );
  }

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

    if (result != null) {
      File file = File(result.files.single.path!);
      setState(() {
        _selectedFile = file;
      });
    }
  }

  Future<void> _uploadFile() async {
    if (_selectedFile == null) return;

    var request = http.MultipartRequest('POST', Uri.parse('YOUR_UPLOAD_URL_HERE'));
    var multipartFile = await http.MultipartFile.fromPath(
      'file',
      _selectedFile!.path,
      contentType: MediaType('application', 'octet-stream'),
    );

    request.files.add(multipartFile);

    var response = await request.send();
    if (response.statusCode == 200) {
      print('File uploaded successfully');
    } else {
      print('Failed to upload file');
    }

    response.stream.bytesToString().then(print);
  }
}

注意事项

  1. 依赖项:确保你已经安装了 file_picker 插件,因为示例中使用了它来选择文件。你可以在 pubspec.yaml 中添加 file_picker 依赖:

    dependencies:
      file_picker: ^x.y.z  # 请将 x.y.z 替换为最新版本号
    
  2. 权限:在 AndroidManifest.xmlInfo.plist 中添加必要的文件读写权限。

  3. URL:将 'YOUR_UPLOAD_URL_HERE' 替换为你的实际文件上传服务器URL。

  4. 错误处理:示例代码中没有包含详细的错误处理逻辑,你可以根据需求添加更多的错误处理和用户反馈。

这个示例展示了如何使用 file_picker 插件选择文件,并通过 http 包进行文件上传。虽然示例中没有直接使用 uploader 插件(因为 uploader 插件可能不是最流行的选择,且示例通常使用更广泛使用的库),但你可以根据 uploader 插件的文档调整代码以适应其API。希望这个示例能帮助你理解文件上传的基本流程。

回到顶部