iOS 图片视频上传服务器

     项目新增需求,需要用户把手机里的视频和图片上传,焦头烂额弄了三天,总算是实现功能了。于是记下实现代码,对于刚做视频这方面的或许有点帮助吧,也让自己以后有需要了还可以回过头看一看。做iOS几个月了,做明显的感受是,大牛真的是大牛,想成为大牛就得一步一个脚印,虚心求教,埋头苦干,不说了,代码奉上。


- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex

{

    NSLog(@"buttonIndex = [%ld]",buttonIndex);

    switch (buttonIndex) {

        case 0://照相机

        {                 UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];

            imagePicker.delegate = self;

            imagePicker.allowsEditing = YES;

            imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;

            imagePicker.mediaTypes =  [[NSArray alloc] initWithObjects: (NSString *) kUTTypeImage, nil];

            [self presentModalViewController:imagePicker animated:YES];

            

        }

            break;

        case 1://摄像机

        {

            AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];

            if (authStatus == AVAuthorizationStatusRestricted

                || authStatus == AVAuthorizationStatusDenied) {

                NSLog(@"摄像头已被禁用,您可在设置应用程序中进行开启");

                return;

            }

            

            if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {

                UIImagePickerController *picker = [[UIImagePickerController alloc] init];

                picker.delegate = self;

                picker.allowsEditing = YES;

                picker.sourceType = UIImagePickerControllerSourceTypeCamera;

                picker.videoQuality = UIImagePickerControllerQualityType640x480; //录像质量

                picker.videoMaximumDuration = 5 * 60.0f; // 限制视频录制最多不超过5分钟

                picker.mediaTypes = @[(NSString *)kUTTypeMovie];

                [self presentViewController:picker animated:YES completion:NULL];

//                self.shouldAsync = YES;

            } else {

                NSLog(@"手机不支持摄像");

            }

            

        }

            break;

        case 2://本地相簿

        {

            UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];

            imagePicker.delegate = self;

            imagePicker.allowsEditing = YES;

            imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

            imagePicker.mediaTypes =  [[NSArray alloc] initWithObjects: (NSString *) kUTTypeImage, nil];

            [self presentModalViewController:imagePicker animated:YES];

            

        }

            break;

        case 3://本地视频

        {

            if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {

                UIImagePickerController *imagePicker = [[UIImagePickerController alloc]init];

                imagePicker.videoQuality =UIImagePickerControllerQualityTypeIFrame960x540;//视频质量设置

                imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;

                imagePicker.delegate = self;

                imagePicker.allowsEditing = YES;

                imagePicker.videoMaximumDuration = 300.0f;//设置最长录制5分钟

                imagePicker.mediaTypes = [NSArray arrayWithObject:@"public.movie"];

                [self presentModalViewController:imagePicker animated:YES];

                

            }

        }

        case 4://本地音频

        {

            

            

        }

            break;

        default:

            break;

    }

}



- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {

    

    NSString *type = [info objectForKey:UIImagePickerControllerMediaType];

    

    if ([type isEqualToString:@"public.image"]) {

        

        UIImage* image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];

        CGSize imagesize = image.size;

        imagesize.height =626;

        imagesize.width =413;

        //对图片大小进行压缩--

        image = [self imageWithImage:image scaledToSize:imagesize];

        

        NSData *data;

        if (UIImagePNGRepresentation(image) == nil){

            data = UIImageJPEGRepresentation(image, 1.0);

        }

        else

        {

            data = UIImagePNGRepresentation(image);

        }

        

        //图片保存的路径

        //这里将图片放在沙盒的documents文件夹中

        NSString * DocumentsPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];

        

        //文件管理器

        NSFileManager *fileManager = [NSFileManager defaultManager];

        

        //把刚刚图片转换的data对象拷贝至沙盒中 并保存为image.png

        [fileManager createDirectoryAtPath:DocumentsPath withIntermediateDirectories:YES attributes:nil error:nil];

        [fileManager createFileAtPath:[DocumentsPath stringByAppendingString:@"/image.png"] contents:data attributes:nil];

        

        //得到选择后沙盒中图片的完整路径

        NSString  *filePath = [[NSString alloc]initWithFormat:@"%@%@",DocumentsPath,  @"/image.png"];

        NSData *imgData = [NSData dataWithContentsOfFile:filePath];

               NSString *str = @"XXXXXXXXXXXXXXXX";

                AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

//        [manager setRequestSerializer:[AFXMLParserResponseSerializer  serializer]];

            manager.responseSerializer = [AFHTTPResponseSerializer serializer];

        [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];

        [manager.requestSerializer setValue:@"application/json; charset=utf-8" forHTTPHeaderField:@"Content-Type"];

        

        manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/plain", nil];

        

        [manager POST:str parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {

            [formData appendPartWithFileData:imgData name:@"Filedata"fileName:@"test.jpg"mimeType:@"image/jpg"];

        }success:^(AFHTTPRequestOperation *operation,id responseObject) {

            // upload succ

            NSString *str = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];

            NSLog(@"%@",str);

            


            

            

        }failure:^(AFHTTPRequestOperation *operation,NSError *error) {

            NSLog(@"#######upload error%@", error);

        }];

    }else if ([type isEqualToString:@"public.movie"]){

        

        // 如果是视频

        NSURL *url = info[UIImagePickerControllerMediaURL];

        // 获取视频总时长

        CGFloat lengthTime = [self getVideoLength:url];

        NSLog(@"%f",lengthTime);

        // 保存视频至相册 (异步线程)

        NSString *urlStr = [url path];

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

            

            if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(urlStr)) {

                

                UISaveVideoAtPathToSavedPhotosAlbum(urlStr, self, @selector(video:didFinishSavingWithError:contextInfo:), nil);

            }

            

        });


        

        //转换时文件不能已存在,否则出错

        AVURLAsset *avAsset = [AVURLAsset URLAssetWithURL:url options:nil];

        NSArray *compatiblePresets = [AVAssetExportSession exportPresetsCompatibleWithAsset:avAsset];

        if ([compatiblePresets containsObject:AVAssetExportPresetMediumQuality]) {

            AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:avAsset presetName:AVAssetExportPresetMediumQuality];

            NSDateFormatter *formater = [[NSDateFormatter alloc] init];//用时间给文件全名,以免重复,在测试的时候其实可以判断文件是否存在若存在,则删除,重新生成文件即可

            [formater setDateFormat:@"yyyy-MM-dd-HH:mm:ss"];

            NSString* resultPath = [NSHomeDirectory() stringByAppendingFormat:@"/Documents/output-%@.mp4", [formater stringFromDate:[NSDate date]]];

            NSLog(@"%@",resultPath);

            exportSession.outputURL = [NSURL fileURLWithPath:resultPath];

            exportSession.outputFileType = AVFileTypeMPEG4;

            [exportSession exportAsynchronouslyWithCompletionHandler:^(void)

             {

                 

                 if (exportSession.status == AVAssetExportSessionStatusCompleted) {

                     

                     

//                     NSData *videoData = [NSData dataWithContentsOfURL:exportSession.outputURL];

//                     AVPlayer *player = [AVPlayer playerWithURL:exportSession.outputURL];

//                     AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player];

//                     playerLayer.frame = self.view.bounds;

//                     [self.view.layer addSublayer:playerLayer];

//                     [player play];


                     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

                     NSString *str = @"xxxxxxxxxx";

                     //formData: 专门用于拼接需要上传的数据,在此位置生成一个要上传的数据体

                     [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];

                     [manager.requestSerializer setValue:@"application/json; charset=utf-8" forHTTPHeaderField:@"Content-Type"];

                     manager.responseSerializer = [AFHTTPResponseSerializer serializer];

                     [manager.responseSerializer setAcceptableContentTypes:[NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/css",@"text/plain", @"application/javascript",@"application/json", @"application/x-www-form-urlencoded", nil]];

                     [manager POST:str parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {

                         

                         NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

                         // 设置时间格式

                         //                NSLog(@"%@",videoData);

                         formatter.dateFormat = @"yyyyMMddHHmmss";

                         NSString *str = [formatter stringFromDate:[NSDate date]];

                         NSString *fileName = [NSString stringWithFormat:@"%@.mov", str];

//                         [formData appendPartWithFileData:videoData name:@"Filename" fileName:fileName

//                                                 mimeType:@"video/quicktime"];

                         [formData appendPartWithFileURL:exportSession.outputURL name:@"Filedata" fileName:fileName mimeType:@"video/quicktime" error:nil];

                         NSLog(@"formData===%@",formData);

                         

                     } success:^(NSURLSessionDataTask *task, id responseObject) {

                         

                         NSString *str = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];

                         NSLog(@"%@",str);

                         

                         

                     } failure:^(NSURLSessionDataTask *task, NSError *error) {

                         

                         NSLog(@"error=====%@",error);

                         

                     }];


                 }

                 

             }];

        }


        


//            NSDictionary *dict = @{@"username":@"syl"};

            /*

             @param url 服务器地址

             @param parameters 字典 token

             @param fileData 要上传的数据

             @param name 服务器参数名称 后台给你

             @param fileName 文件名称 图片:xxx.jpg,xxx.png 视频:video.mov

             @param mimeType 文件类型 图片:image/jpg,image/png 视频:video/quicktime

             @param style 返回的数据类型

             @param progress

             @param success

             @param failure

             

             

            

        

        

        }

    }

    

    

    [self dismissModalViewControllerAnimated:YES];

}



  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值