Flutter云端图像处理插件cloudinary_public的使用

Flutter云端图像处理插件cloudinary_public的使用

cloudinary_public

Build Status Coverage Status

此包允许您直接将媒体文件上传到Cloudinary,而无需暴露您的apiKey或secretKey。

Getting started

添加依赖cloudinary_public: ^0.23.1到您的项目:

import 'package:cloudinary_public/cloudinary_public.dart';

final cloudinary = CloudinaryPublic('CLOUD_NAME', 'UPLOAD_PRESET', cache: false);

请参考如何创建一个上传预设

使用Image Picker插件

var image = await ImagePicker.pickImage(source: ImageSource.camera);

try {
    CloudinaryResponse response = await cloudinary.uploadFile(
        CloudinaryFile.fromFile(image.path, resourceType: CloudinaryResourceType.Image),
    );
    
    print(response.secureUrl);
} on CloudinaryException catch (e) {
  print(e.message);
  print(e.request);
}

使用Multi Image Picker插件

final images = await MultiImagePicker.pickImages(maxImages: 4);

List<CloudinaryResponse> uploadedImages = await cloudinary.multiUpload(
images
    .map(
      (image) => CloudinaryFile.fromFutureByteData(
        image.getByteData(),
        identifier: image.identifier,
      ),
    )
    .toList(),
);

print(uploadedImages[0].secureUrl);

图像变换

// CloudinaryImage
final cloudinaryImage = CloudinaryImage('https://res.cloudinary.com/demo/image/upload/front_face.png');
// or using the image public id
final cloudinaryImage = cloudinary.getImage('front_face');

final String url = cloudinaryImage.transform().width(150).height(150).gravity('face').crop('thumb').generate();
// or using the shortcut
final String url = cloudinaryImage.thumbnail(width: 150, height: 150).generate();

// Chain example
final url = cloudinaryImage.transform()
    .width(150)
    .height(150)
    .gravity('face')
    .crop('thumb')
    .chain()
    .radius(20)
    .chain()
    .effect('sepia')
    .chain()
    .overlay(cloudinary.getImage('cloudinary_icon'))
    .gravity('south_east')
    .x(5)
    .y(5)
    .width(50)
    .opacity(60)
    .effect('brightness:200')
    .chain()
    .angle(10)
    .generate();
// generates
// https://res.cloudinary.com/demo/image/upload/c_thumb,g_face,h_150,w_150/r_20/e_sepia/e_brightness:200,g_south_east,l_cloudinary_icon,o_60,w_50,x_5,y_5/a_10/front_face.png

上传进度

final res = await cloudinary.uploadFile(
  CloudinaryFile.fromFile(
    _pickedFile.path,
    folder: 'hello-folder',
    context: {
      'alt': 'Hello',
      'caption': 'An example image',
    },
  ),
  onProgress: (count, total) {
    setState(() {
      _uploadingPercentage = (count / total) * 100;
    });
  },
);

分块上传

当文件大小超过100兆字节时,使用分块上传。默认情况下,块大小设置为20兆字节,但可以使用chunk_size参数将其设置为低至5兆字节。

final res = await cloudinary.uploadFileInChunks(
  CloudinaryFile.fromFile(
    _pickedFile.path,
    folder: 'hello-folder',
    context: {
      'alt': 'Hello',
      'caption': 'An example upload in chunks',
    },
  ),
  chunkSize: 10000000,
  onProgress: (count, total) {
    setState(() {
      _uploadingPercentage = (count / total) * 100;
    });
  },
);

示例代码

下面是一个完整的示例,展示了如何在Flutter应用中集成cloudinary_public来实现图像选择和上传功能。

import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:cloudinary_public/cloudinary_public.dart';

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

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

class ImagePickerExample extends StatefulWidget {
  @override
  _ImagePickerExampleState createState() => _ImagePickerExampleState();
}

class _ImagePickerExampleState extends State<ImagePickerExample> {
  final cloudinary = CloudinaryPublic('CLOUD_NAME', 'UPLOAD_PRESET', cache: false);
  double _uploadingPercentage = 0;

  Future<void> _uploadImage() async {
    final picker = ImagePicker();
    final pickedFile = await picker.getImage(source: ImageSource.gallery);

    if (pickedFile != null) {
      try {
        CloudinaryResponse response = await cloudinary.uploadFile(
          CloudinaryFile.fromFile(pickedFile.path, resourceType: CloudinaryResourceType.Image),
          onProgress: (count, total) {
            setState(() {
              _uploadingPercentage = (count / total) * 100;
            });
          },
        );

        print('Image URL: ${response.secureUrl}');
      } on CloudinaryException catch (e) {
        print('Error uploading image: ${e.message}');
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Image Upload Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _uploadImage,
              child: Text('Pick and Upload Image'),
            ),
            SizedBox(height: 20),
            Text('Uploading... $_uploadingPercentage%'),
          ],
        ),
      ),
    );
  }
}

这个示例应用程序提供了一个按钮,用于从图库中选择图片并将其上传到Cloudinary。它还显示了上传进度。您可以根据需要调整代码以适应不同的需求。


更多关于Flutter云端图像处理插件cloudinary_public的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter云端图像处理插件cloudinary_public的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用cloudinary_public插件进行云端图像处理的示例代码。这个插件允许你通过Cloudinary的API进行图像的上传、转换和处理。

首先,你需要在你的Flutter项目中添加cloudinary_public依赖。打开你的pubspec.yaml文件,并添加以下依赖:

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

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

接下来,你需要配置Cloudinary的凭证。在Cloudinary的网站上注册并获取你的Cloudinary的cloud_nameapi_keyapi_secret。然后,在你的Flutter项目的android/app/src/main/AndroidManifest.xmlios/Runner/Info.plist中添加这些配置(确保不将api_secret暴露在客户端代码中,这里只是为了示例)。

对于Android,你可以在AndroidManifest.xml中添加一个meta-data标签:

<application
    ...>
    <meta-data
        android:name="com.cloudinary.android.CLOUD_NAME"
        android:value="your_cloud_name" />
    <meta-data
        android:name="com.cloudinary.android.API_KEY"
        android:value="your_api_key" />
    <meta-data
        android:name="com.cloudinary.android.API_SECRET"
        android:value="your_api_secret" /> <!-- 注意:实际项目中不应将api_secret放在客户端 -->
</application>

对于iOS,你可以在Info.plist中添加:

<key>CloudinaryCloudName</key>
<string>your_cloud_name</string>
<key>CloudinaryApiKey</key>
<string>your_api_key</string>
<key>CloudinaryApiSecret</key>
<string>your_api_secret</string> <!-- 注意:实际项目中不应将api_secret放在客户端 -->

然后,你可以在你的Dart代码中使用cloudinary_public插件。以下是一个示例,展示如何上传图像并进行简单的处理(比如调整大小):

import 'package:flutter/material.dart';
import 'package:cloudinary_public/cloudinary_public.dart';
import 'dart:io';
import 'package:image_picker/image_picker.dart';

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

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

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  final picker = ImagePicker();
  Cloudinary? cloudinary;

  @override
  void initState() {
    super.initState();
    // 初始化Cloudinary实例,注意不要在客户端代码中硬编码api_secret
    cloudinary = Cloudinary(
      cloudName: 'your_cloud_name',
      apiKey: 'your_api_key',
      // apiSecret: 'your_api_secret', // 不要在客户端代码中包含api_secret
    );
  }

  Future<void> pickAndUploadImage() async {
    final pickedFile = await picker.pickImage(source: ImageSource.camera);

    if (pickedFile == null) return;

    final file = File(pickedFile.path);
    final uploadResult = await cloudinary!.upload(
      file: file,
      publicId: 'sample_image', // 可以根据需求自定义
      transformation: [
        Transformation().width(800).height(600).crop('fill'), // 调整大小并裁剪
      ],
    );

    // 上传成功后,你可以获取到图像的URL
    if (uploadResult != null && uploadResult.secureUrl != null) {
      print('Uploaded image URL: ${uploadResult.secureUrl}');
      // 这里可以显示图像或进行其他处理
    } else {
      print('Failed to upload image');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Cloudinary Example'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: pickAndUploadImage,
          child: Text('Pick and Upload Image'),
        ),
      ),
    );
  }
}

在这个示例中,我们使用了image_picker插件来选择图像,并使用cloudinary_public插件来上传和处理图像。注意,在实际应用中,你不应该在客户端代码中硬编码api_secret,而是应该在服务器端处理敏感信息。

确保你已经在pubspec.yaml文件中添加了image_picker依赖,并运行flutter pub get来安装它:

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

这个示例代码展示了如何使用cloudinary_public插件进行基本的图像上传和处理。根据你的需求,你可以进一步自定义和扩展这些功能。

回到顶部