flutter腾讯云上传腾讯云cos使用flutter1.121.17及以上版本ios与flutter混合开发(代码片段)

YunusQ YunusQ     2022-12-14     529

关键词:

flutter 腾讯云 上传腾讯云cos 使用flutter1.12 1.17及以上版本 ios与flutter混合开发

前言

腾讯云对Flutter极不友好 在其官方文档里没有给出flutter的官方插件 flutter插件网https://pub.dev/里唯一的插件经我反复尝试已经不能使用。现研究混合开发,又发现新的flutter版本(>1.12)已经不兼容旧的了,所以需要新的api接口。

这里是安卓的相关代码

https://blog.csdn.net/youtiankeng/article/details/107825986

首先注册腾讯云的cos相关功能

先腾讯云注册cos 获取各类参数名 bucket之类的值 之后会用

代码部分

在这里创建两个文件 下面是对应的代码

TencentCosPlugin.h

//
//  TencentCosPlugin.h
//  Runner
//
//  Created by 孔启超 on 2020/9/4.
//

//#ifndef TencentCosPlugin_h
//#define TencentCosPlugin_h
//
//
//#endif /* TencentCosPlugin_h */

#import <Foundation/Foundation.h>
#import <Flutter/Flutter.h>
#import "TencentCosPlugin.h"
NS_ASSUME_NONNULL_BEGIN
@interface TencentCosPlugin : NSObject<FlutterPlugin>
+ (void)registerWithRegistry:(NSObject<FlutterPluginRegistry>*)registry;
@end
NS_ASSUME_NONNULL_END

TencentCosPlugin.m

//
//  TencentCosPlugin.m
//  Runner
//
//  Created by 孔启超 on 2020/9/4.
//

#import <Foundation/Foundation.h>
#import "TencentCosPlugin.h"
#import "QCloudCore.h"
#import "QCloudCOSXML/QCloudCOSXML.h"

@interface TencentCosPlugin()<QCloudSignatureProvider>
//NSDictionary *arguments;

@property (nonatomic, strong)NSDictionary *arguments;
@property (nonatomic, strong)FlutterMethodChannel *channel;
- (id)initWithChannel:(FlutterMethodChannel *)channel;
@end


@implementation TencentCosPlugin
+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar 
    FlutterMethodChannel* channel = [FlutterMethodChannel
                                     methodChannelWithName:@"tencent_cos"
                                     binaryMessenger:[registrar messenger]];
    TencentCosPlugin* instance = [[TencentCosPlugin alloc] initWithChannel:channel];
    [registrar addMethodCallDelegate:instance channel:channel];


+(void)registerWithRegistry:(NSObject<FlutterPluginRegistry> *)registry
    //注册插件
    [TencentCosPlugin registerWithRegistrar:[registry registrarForPlugin:@"TencentCosPlugin"]];



- (id)initWithChannel:(FlutterMethodChannel *)channel;

    if (self = [super init]) 

        self.channel = channel;

    
    return self;


- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result 
    if ([@"getPlatformVersion" isEqualToString:call.method]) 
        result([@"iOS " stringByAppendingString:[[UIDevice currentDevice] systemVersion]]);
    else if ([@"TencentCos.uploadFile" isEqualToString:call.method]) 
        
        self.arguments = [call arguments];
        NSString *urlstr = self.arguments[@"localPath"];
        //获取后缀名
        NSString *str = urlstr;
        //在urlstr中查找. 获取文件后缀名
        NSRange range = [str rangeOfString:@"."];
        //用途是我们可以把他后面的值截取出来
        NSInteger fromIndex = range.length+range.location-1;
        //backScheme就是文件后缀名
        NSString *backScheme = [urlstr substringFromIndex:fromIndex];
        
        NSURL *url = [NSURL fileURLWithPath:urlstr];
//        NSString *region = self.arguments[@"region"];
        
        NSString *way = self.arguments[@"way"];
//        NSString *bucket = self.arguments[@"bucket"];
       
        QCloudServiceConfiguration* configuration = [QCloudServiceConfiguration new];
//        configuration.appID = appid;

        configuration.signatureProvider = self;
        QCloudCOSXMLEndPoint* endpoint = [[QCloudCOSXMLEndPoint alloc] init];
        // 服务地域简称
        endpoint.regionName = @"ap-shanghai";//服务地域名称,可用的地域请参考注释
        // 使用 HTTPS
        endpoint.useHTTPS = true;
        configuration.endpoint = endpoint;

        [QCloudCOSXMLService registerDefaultCOSXMLWithConfiguration:configuration];
        [QCloudCOSTransferMangerService registerDefaultCOSTransferMangerWithConfiguration:configuration];

        //上传文件
        QCloudCOSXMLUploadObjectRequest* put = [QCloudCOSXMLUploadObjectRequest new];
        
        // Create universally unique identifier (object)

        CFUUIDRef uuidObject = CFUUIDCreate(kCFAllocatorDefault);

        // Get the string representation of CFUUID object.

        NSString *uuidStr = (NSString *)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, uuidObject));
        //获取不带-的uuid
        NSString *uuidStrForaml = [uuidStr stringByReplacingOccurrencesOfString:@"-" withString:@""];
        NSLog(@"%@", uuidStrForaml);
        
        CFRelease(uuidObject);
        NSString *strCospath;
        if ([way isEqualToString:@"video"]) 
          strCospath = [NSString stringWithFormat:@"%@%@%@%@%@", @"app/", way,@"/20.", uuidStrForaml,@".mp4"];
        
        else strCospath = [NSString stringWithFormat:@"%@%@%@%@%@", @"app/", way,@"/20.", uuidStrForaml,backScheme];
        NSLog(@"%@", strCospath);
        //拼接完整的url
        NSString *backurl = [NSString stringWithFormat:@"%@%@", @"https://kt-1301681474.cos.ap-shanghai.myqcloud.com/", strCospath];
        put.object = strCospath;
        put.bucket = @"kt-zzzz";/*自己的bucket*/
        put.body =  url;/*文件的URL*/;
    
        [put setSendProcessBlock:^(int64_t bytesSent, int64_t totalBytesSent, int64_t totalBytesExpectedToSend) 

            NSLog(@"upload %lld totalSend %lld aim %lld", bytesSent, totalBytesSent, totalBytesExpectedToSend);
            NSMutableDictionary *data = [NSMutableDictionary dictionary];
            [data setValue:urlstr forKey:@"localPath" ];
            [data setValue:way forKey:@"way"];
            NSNumber *a = @(totalBytesSent);
            NSNumber *b = @(totalBytesExpectedToSend);
            NSNumber *c =@(a.doubleValue/b.doubleValue*100);
            [data setValue:c forKey:@"progress"];
            [self.channel invokeMethod:@"onProgress" arguments:data];
        ];
        [put setFinishBlock:^(id outputObject, NSError* error) 
            NSMutableDictionary *data = [NSMutableDictionary dictionary];
            [data setValue:urlstr forKey:@"localPath" ];
            [data setValue:way forKey:@"way"];
            if(error.code == 0)
                [self.channel invokeMethod:@"onSuccess" arguments:data];
               NSLog(@"成功上传图片");
//                result(@"0");
                result(backurl);
            else
                [data setValue: error.domain forKey:@"message"];
                [self.channel invokeMethod:@"onFailed" arguments:data];
                 result(@"1");
            

        ];
        [[QCloudCOSTransferMangerService defaultCOSTransferManager] UploadObject:put];
    else 
       NSLog(@"找不到上传方法");
        result(FlutterMethodNotImplemented);
    

- (void) signatureWithFields:(QCloudSignatureFields*)fileds
                     request:(QCloudBizHTTPRequest*)request
                  urlRequest:(NSMutableURLRequest*)urlRequst
                   compelete:(QCloudHTTPAuthentationContinueBlock)continueBlock


    QCloudCredential* credential = [QCloudCredential new];
    credential.secretID = @"xxx"; // 永久密钥 SecretId
    credential.secretKey = @"yyy"; // 永久密钥 SecretKey

    // 使用永久密钥计算签名
    QCloudAuthentationV5Creator* creator = [[QCloudAuthentationV5Creator alloc]
        initWithCredential:credential];
    QCloudSignature* signature = [creator signatureForData:urlRequst];
    continueBlock(signature, nil);

//- (void) signatureWithFields:(QCloudSignatureFields*)fileds
//                     request:(QCloudBizHTTPRequest*)request
//                  urlRequest:(NSMutableURLRequest*)urlRequst
//                   compelete:(QCloudHTTPAuthentationContinueBlock)continueBlock
//    /*向签名服务器请求临时的 Secret ID,Secret Key,Token*/
//    QCloudCredential* credential =  [QCloudCredential new];
//    credential.secretID = self.arguments[@"secretId"];
//    credential.secretKey = self.arguments[@"secretKey"];
//    credential.token = self.arguments[@"sessionToken"];
//    //    credential.expiretionDate     = self.arguments[@"sessionToken"];/*签名过期时间*/
//    QCloudAuthentationV5Creator* creator = [[QCloudAuthentationV5Creator alloc] initWithCredential:credential];
//    QCloudSignature* signature =  [creator signatureForData:urlRequst];
//    continueBlock(signature, nil);
//
@end

然后再继续注册这个混合的插件

import UIKit
import Flutter
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate 
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool 
    GeneratedPluginRegistrant.register(with: self)
    TencentCosPlugin.register(with:self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  

参考的官方文档

腾讯官方文档 https://cloud.tencent.com/document/product/436/12159
暂时使用的是永久秘钥
后续会考虑改用临时秘钥(官方也推荐使用临时秘钥,永远密码只作为开发环境使用)。

php腾讯云cos使用之我见

...为某些人的原因,本文从新改名发布一遍。原名称:tp5--腾讯云cos简单使用原文链接:https://www.cnblogs.com/YFYQ/p/10840050.html因项目需要,本来是需要对接阿里云oss,但因客户错误将云存储买成腾讯云cos,因此简单做了个对象上传使用... 查看详情

python脚本上传文件到腾讯云cos对象存储

...执行结果:提示>5G的文件不能上传。小文件是可以的。腾讯云-对象存储-分块上传待有空,将文件改为参数传入 查看详情

腾讯云cos对象存储的简单使用(代码片段)

  叮当哥之前买了一年的腾讯云服务器,昨日偶然发现腾讯云送了叮当哥半年的cos对象存储服务器,于是就撸起袖子传了几张珍藏的高清大图上去,现将其上传的简单使用步骤总结一波(其它操作参加官方SDK文档API)。说明:... 查看详情

腾讯云储存产品是啥/腾讯云储存储存空间是多大/腾讯云储存怎么上传文件?

腾讯云存储产品云硬盘(CloudBlockStorage)是腾讯云提供的用于CVM实例的持久性数据块级存储。每个云硬盘在其可用区内自动复制,云硬盘中的数据在可用区内以多副本冗余方式存储,避免数据的单点故障风险。云硬盘为您提供处... 查看详情

腾讯云cos,上传,下载,删除,在线查看等操作(代码片段)

研究了下文档,学会的先记录下。首先新建工具类COSUtil。配置账号密码、存储桶以生成客户端(每个方法下都需要配置,为了代码简洁后面的方法会省略):1StringsecretId="root";                       ... 查看详情

备份数据上传腾讯云cos(代码片段)

一、方案背景由于服务器上数据量越来越大,备份的数据会占用硬盘空间(虽说云硬盘可随时扩容,但是存在风险),定时将备份上传到COS。不仅节省服务器硬盘空间,也大大提高备份数据的安全性、可靠性。二、操作步骤1、软件... 查看详情

前端上传文件到腾讯云(代码片段)

...s//npminstallcos-js-sdk-v5--save//生成签名:varcos=newCOS(SecretId:‘腾讯云密钥ID值‘,SecretKey:‘腾讯云密钥key值‘)//上传文件cos.putObject(Bucket:‘‘,//存储桶名称Region:‘‘,//地域名字Key:name,//文件名字StorgeClass:‘STANDARD‘,//存储方式Body:selecte... 查看详情

上传文件到腾讯云存储桶(代码片段)

上传文件到腾讯云存储桶一,配置腾讯云Cos流程图第一步,注册腾讯云账号第二步,选择帐户填写个人信息第三步扫码授权手机端授权第四步点击免费产品五步选择对象存储Cos六步开通服务七步创建存储桶设置cors规... 查看详情

上传文件到腾讯云存储桶(代码片段)

上传文件到腾讯云存储桶一,配置腾讯云Cos流程图第一步,注册腾讯云账号第二步,选择帐户填写个人信息第三步扫码授权手机端授权第四步点击免费产品五步选择对象存储Cos六步开通服务七步创建存储桶设置cors规... 查看详情

上传图片到腾讯云(代码片段)

1、composer安装扩展"qcloud/cos-sdk-v5":"1.*"2、代码,多图<?phpnamespaceAppLibrarylib;useQcloudCosClient;classCosLibconstREGION=‘test‘;constAPP_ID=‘test‘;constSECRET_ID=‘test‘;constSECRET_KEY=‘test‘;const 查看详情

阿里云oss和腾讯云cos互相迁移(代码片段)

利用阿里、腾讯的帮助文档中提供的迁移工具测试迁移对象存储数据。一、腾讯to阿里文档链接:https://help.aliyun.com/document_detail/56990.html?spm=5176.7851628.6.1079.UqBdXKOssImport工具可以将本地、其它云存储的数据迁移到OSS,它有以下特点... 查看详情

使用elk分析腾讯云clb日志(代码片段)

缘起最近在使用腾讯云,想对访问日志进行收集与分析,发现CLB(负责均衡)日志只能保存到COS上面,而且是每个CLB没小时压发送个gz压缩包到COS。实现方式CLB配置日志存储到COS,Filebeat客户端CVM安装cosfs挂载COS,并配置Filebeat输... 查看详情

使用elk分析腾讯云clb日志

参考技术A最近在使用腾讯云,想对访问日志进行收集与分析,发现CLB(负责均衡)日志只能保存到COS上面,而且是每个CLB没小时压发送个gz压缩包到COS。CLB配置日志存储到COS,Filebeat客户端CVM安装cosfs挂载COS,并配置Filebeat输出到... 查看详情

腾讯云cos封装(代码片段)

publicclassCosUtilint_appId=xxxxx;string_secretId="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";string_secretKey="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";string_bucketName="test";publicCosUtil()stringcosAppId=System. 查看详情

利用腾讯云cos云对象存储定时远程备份网站

...om/community 一、优点分析内网传输:和阿里云OSS一样,腾讯云COS同样支持内网和外网文件传输,对于 查看详情

使用腾讯云cos对象存储(详细流程)(代码片段)

一、开通COS对象存储 二、创建存储桶 基本信息所属地域:请选择与您业务(或用户数量)相对集中的物理区域所对应的COS地域,设置后不可修改。地域的更多信息请参见 地域和访问域名。名称:请输入自... 查看详情

一分钟开始持续集成之旅系列之:vue+腾讯云cos上传部署(代码片段)

前言随着Web应用的发展,运行在浏览器端的Web应用能够承担更多且更复杂的业务交互需求,前后端分离模式得以流行,并催生了如Vue、React等单页应用框架。这些框架简化了开发流程,但对于Web应用的部署并没有统一的解决方案... 查看详情

腾讯云对象存储操作流程

文章目录​​1、腾讯云对象存储介绍​​​​1.1、开通“对象存储COS”服务​​​​1.2、创建Bucket​​​​1.3、创建API秘钥​​1、腾讯云对象存储介绍1.1、开通“对象存储COS”服务(1)申请腾讯云账号:https://cloud.tencent.com/(2... 查看详情