XNCameraManager.m 8.79 KB
//
//  XNCameraManager.m
//  IM_ios_client
//
//  Created by 赵世强 on 2018/3/9.
//  Copyright © 2018年 xiniu. All rights reserved.
//

#import "XNCameraManager.h"
#import "ZLPhotoManager.h"
#import "ZLCustomCamera.h"
#import "ToastUtils.h"
#import <AliyunOSSiOS/OSSService.h>
#import "xn_base_Client_AF.h"

#import "FileUploadAuthInfoGetRequest.h"
#import "FileUploadAuthInfoGetResponse.h"


@implementation XNCameraManager

{
    UIViewController *sender;
    OSSClient *client;
               
}

#pragma mark 创建单例
/**
 *  @author qianjun
 *
 *  @brief  创建单例
 *
 *  @return self
 */
+ (instancetype)sharedInstance {
    static id sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[self alloc] init];
    });
    return sharedInstance;
}

-(instancetype)init{
    self = [super init];
    self.passportId = @"";
    return self;
}

- (void)showCameraWithController:(UIViewController *)sender passportId:(NSString *)passportId{
    sender = sender;
    if (passportId) {
        self.passportId = passportId;
    }
    
    if (![ZLPhotoManager haveMicrophoneAuthority]) {
        NSString *message = [NSString stringWithFormat:GetLocalLanguageTextValue(ZLPhotoBrowserNoMicrophoneAuthorityText), kAPPName];
        ShowAlert(message, sender);
        return;
    }
    ZLCustomCamera *camera = [[ZLCustomCamera alloc] init];
    camera.allowTakePhoto = YES;
    camera.allowRecordVideo = NO;
    camera.sessionPreset = ZLCaptureSessionPreset640x480;
    camera.videoType = ZLExportVideoTypeMp4;
    camera.circleProgressColor = [UIColor colorWithRed:((float)((0x3399ff & 0xFF0000) >> 16))/255.0 green:((float)((0x3399ff & 0xFF00) >> 8))/255.0 blue:((float)(0x3399ff & 0xFF))/255.0 alpha:1.0];
    camera.maxRecordDuration = 10;
    zl_weakify(self);
    camera.doneBlock = ^(UIImage *image, NSURL *videoUrl) {
        zl_strongify(weakSelf);
        [strongSelf saveImage:image videoUrl:videoUrl];
    };
    [sender showDetailViewController:camera sender:nil];
}

- (void)saveImage:(UIImage *)image videoUrl:(NSURL *)videoUrl
{
    zl_weakify(self);
    if (image) {
        [ZLPhotoManager saveImageToAblum:image completion:^(BOOL suc, PHAsset *asset) {
            zl_strongify(weakSelf);
            dispatch_async(dispatch_get_main_queue(), ^{
                if (suc) {
//                    ZLPhotoModel *model = [ZLPhotoModel modelWithAsset:asset type:ZLAssetMediaTypeImage duration:nil];
                    NSData* data= UIImageJPEGRepresentation(image, 0.1);
                    [strongSelf uploadFileWithData:data fileType:ZLAssetMediaTypeImage asset:asset];

                    
                } else {
                    ShowToastLong(@"%@", GetLocalLanguageTextValue(ZLPhotoBrowserSaveImageErrorText));
                }
                
            });
        }];
    } else if (videoUrl) {
        [ZLPhotoManager saveVideoToAblum:videoUrl completion:^(BOOL suc, PHAsset *asset) {
            zl_strongify(weakSelf);
            dispatch_async(dispatch_get_main_queue(), ^{
                if (suc) {
                    ZLPhotoModel *model = [ZLPhotoModel modelWithAsset:asset type:ZLAssetMediaTypeVideo duration:nil];

                    model.duration = [ZLPhotoManager getDuration:asset];

                    NSData* data = [NSData dataWithContentsOfURL:videoUrl];
                    
                    [strongSelf uploadFileWithData:data fileType:ZLAssetMediaTypeVideo asset:asset];
                } else {
                    ShowToastLong(@"%@", GetLocalLanguageTextValue(ZLPhotoBrowserSaveVideoFailed));
                }
                
            });
        }];
    }
}

- (void)uploadFileWithData:(NSData *)data fileType:(ZLAssetMediaType)type asset:(PHAsset *)asset{
    
    ZLProgressHUD *hud = [[ZLProgressHUD alloc] init];
    [hud show];
    
    FileUploadAuthInfoGetRequest *req_FileUploadAuthInfoGet = [[FileUploadAuthInfoGetRequest alloc]init];
    [req_FileUploadAuthInfoGet.baseRequest setSession:self.passportId];
    [req_FileUploadAuthInfoGet.baseRequest setMethod:req_FileUploadAuthInfoGet.apimethodName];
    [req_FileUploadAuthInfoGet setName:[asset valueForKey:@"filename"]];
  
    [[xn_base_Client_AF sharedInstance] f_sendRequest:req_FileUploadAuthInfoGet.baseRequest isPost:YES completion:^(NSDictionary *_dict) {

        BaseResponse *_res_base = (BaseResponse *)[_dict objectForKey:kResponseNotiKey_baseResponse];
        NSString *_str_error = [_dict objectForKey:kResponseNotiKey_error];
        if (![_str_error isEqualToString:kNoError]) {
            // 出错
            [hud hide];
            
        }else{
            FileUploadAuthInfoGetResponse *res_FileUploadAuthInfoGet = [[FileUploadAuthInfoGetResponse alloc]init];
            res_FileUploadAuthInfoGet.baseResponse = _res_base;
            
            id<OSSCredentialProvider> credential = [[OSSStsTokenCredentialProvider alloc] initWithAccessKeyId:res_FileUploadAuthInfoGet.accessKeyId secretKeyId:res_FileUploadAuthInfoGet.accessKeySecret securityToken:res_FileUploadAuthInfoGet.securityToken];
            client = [[OSSClient alloc] initWithEndpoint:res_FileUploadAuthInfoGet.info.endpoint credentialProvider:credential];
            
            OSSPutObjectRequest * put = [OSSPutObjectRequest new];
            // 必填字段
            put.bucketName = res_FileUploadAuthInfoGet.info.bucket;
            put.objectKey = [asset valueForKey:@"filename"];

            put.uploadingData = data;
            
            OSSTask * putTask = [client putObject:put];
            [putTask continueWithBlock:^id(OSSTask *task) {
                if (!task.error) {
                    NSLog(@"upload object success! 上传文件成功");
                    NSString * constrainURL = nil;
                    OSSTask *result = [client presignPublicURLWithBucketName:res_FileUploadAuthInfoGet.info.bucket
                                                               withObjectKey:[asset valueForKey:@"filename"]];
                    if (!result.error) {
                        constrainURL = result.result;
                        if (self.finshBlock) {
                            if (type == ZLAssetMediaTypeImage) {
                                self.finshBlock(@{@"url":constrainURL,@"type":@"IMAGE"});
                            }else if (type == ZLAssetMediaTypeVideo){
                                self.finshBlock(@{@"url":constrainURL,@"type":@"VIDEO"});
                            }
                            [hud hide];
                            self.finshBlock = nil;
                        }else{
                            [hud hide];
                        }
                        NSLog(@"error: %@", constrainURL);
                    } else {
                        [hud hide];
                        NSLog(@"error: %@", result.error);
                    }
                    
                } else {
                    [hud hide];
                    NSLog(@"upload object failed, error: %@" , task.error);
                }
                return nil;
            }];
        }
        
        NSLog(@"%@",_dict);
    }];
    
    
//    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//
//    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"multipart/form-data", nil];
//
//    manager.requestSerializer = [AFHTTPRequestSerializer serializer];
//
//    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
//
//    [manager POST:[NSString stringWithFormat:@"https://my.xiniunet.com/api/fileUpload.do?passportId=%@",self.passportId] parameters:body constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
//
//        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
//        // 设置时间格式
//        formatter.dateFormat = @"yyyyMMddHHmmss";
//        NSString *str = [formatter stringFromDate:[NSDate date]];
//        NSString *fileName = [NSString stringWithFormat:@"%@.png", str];
//
//        if (type == ZLAssetMediaTypeVideo) {
//
//            [formData appendPartWithFileData:data name:@"file" fileName:fileName mimeType:@"file/mov"];
//        }else{
//
//            [formData appendPartWithFileData:data name:@"file" fileName:fileName mimeType:@"image/jpg"];
//        }
//
//        NSLog(@"1111");
//
//    } progress:^(NSProgress * _Nonnull uploadProgress) {
//
//        NSLog(@"上传中");
//
//    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
//
//          //请求成功的block回调
//        NSDictionary * dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];
//
//        NSLog(@"上传成功%@",dic);
//        [hud hide];
//
//
//    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
//
//        NSLog(@"上传失败%@",error);
//        [hud hide];
//    }];
}

@end