Flutter使用阿里云oss服务存储图片以及文件

阿里云oss服务中,尚未发现有关flutter的文档,在使用过程中遇到了诸多麻烦,最终多处搜集,找到了一个合适的方法。

 

本文讲述的上传文件前提为,权限是私有的,需验证身份后方可上传。

 

本文基于说明文档中的api中的postobject文档。

首先,根据文中要求:

Post Signature

对于验证的Post请求,HTML表单中必须包含policy和Signature信息。policy控制请求中那些值是允许的。计算Signature的具体流程为:

  1. 创建一个 UTF-8 编码的 policy。
  2. 将 policy 进行 base64 编码,其值即为 policy 表单域该填入的值,将该值作为将要签名的字符串。
  3. 使用 AccessKeySecret 对要签名的字符串进行签名,签名方法与Head中签名的计算方法相同(将要签名的字符串替换为 policy 即可),请参见在Header中包含签名。

 

下面是对应的flutter代码:

//验证文本域
static String policyText = 
'{"expiration": "2020-01-01T12:00:00.000Z","conditions": [["content-length-range", 0, 1048576000]]}';

//进行utf8编码
static List policyText_utf8 = utf8.encode(policyText);

//进行base64编码
static String policy_base64 = base64.encode(policyText_utf8);

//再次进行utf8编码
static List policy = utf8.encode(policy_base64);

 

接下来使用阿里云控制台生成的accesskey对上述policy进行加密,代码如下:


static String accesskey= '你的accesskey';

//进行utf8 编码
static List key = utf8.encode(accesskey);

//通过hmac,使用sha1进行加密
static List signature_pre  = new Hmac(sha1, key).convert(policy).bytes;

//最后一步,将上述所得进行base64 编码
String signature = base64.encode(signature_pre);

 

最后,使用flutter中提供的dio网络访问框架进行上传,代码如下:

//要上传的文件,此处为从相册选择照片
File imageFile = await ImagePicker.pickImage(source: ImageSource.gallery);

//dio的请求配置,这一步非常重要!
    Options options = new Options();
    options.responseType = ResponseType.PLAIN;

//创建dio对象
    Dio dio = new Dio(options);

//文件名
    String fileName = "uploadImage.jpg";

//创建一个formdata,作为dio的参数
    FormData data = new FormData.from({
      'Filename': '文件名,随意',
      'key' : "可以填写文件夹名(对应于oss服务中的文件夹)/" + fileName,
      'policy': policy_base64,
      'OSSAccessKeyId': accessid,
      'success_action_status' : '200', //让服务端返回200,不然,默认会返回204
      'signature': signature,
      'file': new UploadFileInfo(imageFile, "imageFileName")
    });



    try {
      Response response = await dio.post(“oss的服务器地址(包含地址前缀的那一串)”,data: data);
      print(response.headers);
      print(response.data);

    } on DioError catch(e) {
      print(e.message);
      print(e.response.data);
      print(e.response.headers);
      print(e.response.request);
    }

 

 

至此文件便可上传成功,两个需要注意的点:

1.所需引入的包包括:

import 'package:crypto/crypto.dart';
import 'package:dio/dio.dart';
import 'dart:io';
import 'dart:async';
import 'dart:convert';

 

2.在dio的上传文件中,需要将返回值设置为普通文字,而dio默认的返回格式是json,阿里云oss服务器会报错。这一步非常重要。

 

最后,获取文件名,可登录阿里云oss控制台查看某一文件的下载地址,对于不同的读写权限,读文件时所需的步骤并不相同。此处不做讲解。

你可能感兴趣的:(flutter,flutter,阿里云oss,flutter,dio)