Flutter云端图像处理插件cloudinary_public的使用
Flutter云端图像处理插件cloudinary_public的使用
cloudinary_public
此包允许您直接将媒体文件上传到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
更多关于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_name
、api_key
和api_secret
。然后,在你的Flutter项目的android/app/src/main/AndroidManifest.xml
和ios/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
插件进行基本的图像上传和处理。根据你的需求,你可以进一步自定义和扩展这些功能。