亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS實現視頻和圖片的上傳思路

2020-07-26 02:54:11
字體:
來源:轉載
供稿:網友

關于iOS如何實現視頻和圖片的上傳, 我們先理清下思路,然后小編根據思路一步一步給大家詳解實現過程。

思路:

#1. 如何獲取圖片?

#2. 如何獲取視頻?

#3. 如何把圖片存到緩存路徑中?

#4. 如何把視頻存到緩存路徑中?

#5. 如何上傳?

接下來, 我們按照上面的思路一步一步實現

首先我們新建一個類, 用來儲存每一個要上傳的文件uploadModel.h

#import <Foundation/Foundation.h>@interface uploadModel : NSObject@property (nonatomic, strong) NSString *path;@property (nonatomic, strong) NSString *type;@property (nonatomic, strong) NSString *name;@property (nonatomic, assign) BOOL   isUploaded;@end

#1. 如何獲取圖片?

從相冊選擇 或者 拍照,

這部分可以用UIImagePickerController來實現

代碼如下:

- (void)actionPhoto {  UIAlertController *alertController = /  [UIAlertController alertControllerWithTitle:@""                    message:@"上傳照片"                 preferredStyle:UIAlertControllerStyleActionSheet];  UIAlertAction *photoAction = /  [UIAlertAction actionWithTitle:@"從相冊選擇"               style:UIAlertActionStyleDefault              handler:^(UIAlertAction * _Nonnull action) {                NSLog(@"從相冊選擇");                self.imagePicker.sourceType  = UIImagePickerControllerSourceTypePhotoLibrary;                self.imagePicker.mediaTypes = @[(NSString *)kUTTypeImage];                self.imagePicker.allowsEditing = YES;                [self presentViewController:self.imagePicker                         animated:YES                        completion:nil];              }];  UIAlertAction *cameraAction = /  [UIAlertAction actionWithTitle:@"拍照"               style:UIAlertActionStyleDefault              handler:^(UIAlertAction * _Nonnull action) {                NSLog(@"拍照");                if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {                  self.imagePicker.sourceType    = UIImagePickerControllerSourceTypeCamera;                  self.imagePicker.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;                  self.imagePicker.cameraDevice   = UIImagePickerControllerCameraDeviceRear;                  self.imagePicker.allowsEditing   = YES;                  [self presentViewController:self.imagePicker                           animated:YES                          completion:nil];                }              }];  UIAlertAction *cancelAction = /  [UIAlertAction actionWithTitle:@"取消"               style:UIAlertActionStyleCancel              handler:^(UIAlertAction * _Nonnull action) {                NSLog(@"取消");              }];  [alertController addAction:photoAction];  [alertController addAction:cameraAction];  [alertController addAction:cancelAction];  [self presentViewController:alertController animated:YES completion:nil];}

#2. 如果獲取視頻?

從相冊選擇 或者 拍攝

這部分也可以用UIImagePickerController來實現

代碼:

- (void)actionVideo {  UIAlertController *alertController = /  [UIAlertController alertControllerWithTitle:@""                    message:@"上傳視頻"                 preferredStyle:UIAlertControllerStyleActionSheet];  UIAlertAction *photoAction = /  [UIAlertAction actionWithTitle:@"從視頻庫選擇"               style:UIAlertActionStyleDefault              handler:^(UIAlertAction * _Nonnull action) {                NSLog(@"從視頻庫選擇");                self.imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;                self.imagePicker.mediaTypes = @[(NSString *)kUTTypeMovie];                self.imagePicker.allowsEditing = NO;                [self presentViewController:self.imagePicker animated:YES completion:nil];              }];  UIAlertAction *cameraAction = /  [UIAlertAction actionWithTitle:@"錄像"               style:UIAlertActionStyleDefault              handler:^(UIAlertAction * _Nonnull action) {                NSLog(@"錄像");                self.imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;                self.imagePicker.cameraDevice = UIImagePickerControllerCameraDeviceRear;                self.imagePicker.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];                self.imagePicker.videoQuality = UIImagePickerControllerQualityType640x480;                self.imagePicker.cameraCaptureMode = UIImagePickerControllerCameraCaptureModeVideo;                self.imagePicker.allowsEditing = YES;                [self presentViewController:self.imagePicker animated:YES completion:nil];              }];  UIAlertAction *cancelAction = /  [UIAlertAction actionWithTitle:@"取消"               style:UIAlertActionStyleCancel              handler:^(UIAlertAction * _Nonnull action) {                NSLog(@"取消");              }];  [alertController addAction:photoAction];  [alertController addAction:cameraAction];  [alertController addAction:cancelAction];  [self presentViewController:alertController animated:YES completion:nil];}

#3, 關于緩存, 如何把照片存入緩存目錄?

這部分我們先考慮緩存目錄, 一般存在Document 或者 Temp里面

我們給圖片和視頻各創建一個緩存目錄:

#define PHOTOCACHEPATH [NSTemporaryDirectory() stringByAppendingPathComponent:@"photoCache"]#define VIDEOCACHEPATH [NSTemporaryDirectory() stringByAppendingPathComponent:@"videoCache"]

把UIImage存入緩存的方法:

//將Image保存到緩存路徑中- (void)saveImage:(UIImage *)image toCachePath:(NSString *)path {  NSFileManager *fileManager = [NSFileManager defaultManager];  if (![fileManager fileExistsAtPath:PHOTOCACHEPATH]) {    NSLog(@"路徑不存在, 創建路徑");    [fileManager createDirectoryAtPath:PHOTOCACHEPATH        withIntermediateDirectories:YES                attributes:nil                   error:nil];  } else {    NSLog(@"路徑存在");  }  //[UIImagePNGRepresentation(image) writeToFile:path atomically:YES];  [UIImageJPEGRepresentation(image, 1) writeToFile:path atomically:YES];}

4. 如何把視頻存入緩存?

把視頻存入緩存的方法:

//將視頻保存到緩存路徑中- (void)saveVideoFromPath:(NSString *)videoPath toCachePath:(NSString *)path {  NSFileManager *fileManager = [NSFileManager defaultManager];  if (![fileManager fileExistsAtPath:VIDEOCACHEPATH]) {    NSLog(@"路徑不存在, 創建路徑");    [fileManager createDirectoryAtPath:VIDEOCACHEPATH        withIntermediateDirectories:YES                attributes:nil                   error:nil];  } else {    NSLog(@"路徑存在");  }  NSError *error;  [fileManager copyItemAtPath:videoPath toPath:path error:&error];  if (error) {    NSLog(@"文件保存到緩存失敗");  }}

從緩存獲取圖片的方法:

//從緩存路徑獲取照片- (UIImage *)getImageFromPath:(NSString *)path {  NSFileManager *fileManager = [NSFileManager defaultManager];  if ([fileManager fileExistsAtPath:path]) {    return [UIImage imageWithContentsOfFile:path];  }  return nil;}

上傳圖片和視頻的時候我們一般會利用當前時間給文件命名, 方法如下

//以當前時間合成圖片名稱- (NSString *)getImageNameBaseCurrentTime {  NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];  [dateFormatter setDateFormat:@"yyyy-MM-dd HH-mm-ss"];  return [[dateFormatter stringFromDate:[NSDate date]] stringByAppendingString:@".JPG"];}//以當前時間合成視頻名稱- (NSString *)getVideoNameBaseCurrentTime {  NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];  [dateFormatter setDateFormat:@"yyyy-MM-dd HH-mm-ss"];  return [[dateFormatter stringFromDate:[NSDate date]] stringByAppendingString:@".MOV"];}

有時候需要獲取視頻的第一幀作為顯示, 方法如下:

//獲取視頻的第一幀截圖, 返回UIImage//需要導入AVFoundation.h- (UIImage*) getVideoPreViewImageWithPath:(NSURL *)videoPath{  AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoPath options:nil];  AVAssetImageGenerator *gen     = [[AVAssetImageGenerator alloc] initWithAsset:asset];  gen.appliesPreferredTrackTransform = YES;  CMTime time   = CMTimeMakeWithSeconds(0.0, 600);  NSError *error  = nil;  CMTime actualTime;  CGImageRef image = [gen copyCGImageAtTime:time actualTime:&actualTime error:&error];  UIImage *img   = [[UIImage alloc] initWithCGImage:image];  return img;}

5. 如何上傳?

下面就是上傳方法:

我把服務器地址xx掉了, 大家可以改為自己的

//上傳圖片和視頻- (void)uploadImageAndMovieBaseModel:(uploadModel *)model {  //獲取文件的后綴名  NSString *extension = [model.name componentsSeparatedByString:@"."].lastObject;  //設置mimeType  NSString *mimeType;  if ([model.type isEqualToString:@"image"]) {    mimeType = [NSString stringWithFormat:@"image/%@", extension];  } else {    mimeType = [NSString stringWithFormat:@"video/%@", extension];  }  //創建AFHTTPSessionManager  AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];  //設置響應文件類型為JSON類型  manager.responseSerializer  = [AFJSONResponseSerializer serializer];  //初始化requestSerializer  manager.requestSerializer   = [AFHTTPRequestSerializer serializer];  manager.responseSerializer.acceptableContentTypes = nil;  //設置timeout  [manager.requestSerializer setTimeoutInterval:20.0];  //設置請求頭類型  [manager.requestSerializer setValue:@"form/data" forHTTPHeaderField:@"Content-Type"];  //設置請求頭, 授權碼  [manager.requestSerializer setValue:@"YgAhCMxEehT4N/DmhKkA/M0npN3KO0X8PMrNl17+hogw944GDGpzvypteMemdWb9nlzz7mk1jBa/0fpOtxeZUA==" forHTTPHeaderField:@"Authentication"];  //上傳服務器接口  NSString *url = [NSString stringWithFormat:@"http://xxxxx.xxxx.xxx.xx.x"];  //開始上傳  [manager POST:url parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {    NSError *error;    BOOL success = [formData appendPartWithFileURL:[NSURL fileURLWithPath:model.path] name:model.name fileName:model.name mimeType:mimeType error:&error];    if (!success) {      NSLog(@"appendPartWithFileURL error: %@", error);    }  } progress:^(NSProgress * _Nonnull uploadProgress) {    NSLog(@"上傳進度: %f", uploadProgress.fractionCompleted);  } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {    NSLog(@"成功返回: %@", responseObject);    model.isUploaded = YES;    [self.uploadedArray addObject:model];  } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {    NSLog(@"上傳失敗: %@", error);    model.isUploaded = NO;  }];}

這里有事先創建兩個可變數組uploadArray, uploadedArray, 一個存放準要上傳的內容, 一個存放上傳完的內容

在準備上傳后做什么操作, 可以檢查兩個數組的數量是否相等

最后是UIImagePickerController的協議方法

#pragma mark - UIImagePickerDelegate methods- (void)imagePickerController:(UIImagePickerController *)pickerdidFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {  [picker dismissViewControllerAnimated:YES completion:nil];  //獲取用戶選擇或拍攝的是照片還是視頻  NSString *mediaType = info[UIImagePickerControllerMediaType];  if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) {    //獲取編輯后的照片    NSLog(@"獲取編輯后的好片");    UIImage *tempImage = info[UIImagePickerControllerEditedImage];    //將照片存入相冊    if (tempImage) {      if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {        //將照片存入相冊        NSLog(@"將照片存入相冊");        UIImageWriteToSavedPhotosAlbum(tempImage, self, nil, nil);      }      //獲取圖片名稱      NSLog(@"獲取圖片名稱");      NSString *imageName = [self getImageNameBaseCurrentTime];      NSLog(@"圖片名稱: %@", imageName);      //將圖片存入緩存      NSLog(@"將圖片寫入緩存");      [self saveImage:tempImage        toCachePath:[PHOTOCACHEPATH stringByAppendingPathComponent:imageName]];      //創建uploadModel      NSLog(@"創建model");      uploadModel *model = [[uploadModel alloc] init];      model.path    = [PHOTOCACHEPATH stringByAppendingPathComponent:imageName];      model.name    = imageName;      model.type    = @"image";      model.isUploaded = NO;      //將模型存入待上傳數組      NSLog(@"將Model存入待上傳數組");      [self.uploadArray addObject:model];    }  }  else if ([mediaType isEqualToString:(NSString *)kUTTypeMovie]) {    if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {      //如果是拍攝的視頻, 則把視頻保存在系統多媒體庫中      NSLog(@"video path: %@", info[UIImagePickerControllerMediaURL]);      ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];      [library writeVideoAtPathToSavedPhotosAlbum:info[UIImagePickerControllerMediaURL] completionBlock:^(NSURL *assetURL, NSError *error) {        if (!error) {          NSLog(@"視頻保存成功");        } else {          NSLog(@"視頻保存失敗");        }      }];    }    //生成視頻名稱    NSString *mediaName = [self getVideoNameBaseCurrentTime];    NSLog(@"mediaName: %@", mediaName);    //將視頻存入緩存    NSLog(@"將視頻存入緩存");    [self saveVideoFromPath:info[UIImagePickerControllerMediaURL] toCachePath:[VIDEOCACHEPATH stringByAppendingPathComponent:mediaName]];    //創建uploadmodel    uploadModel *model = [[uploadModel alloc] init];    model.path    = [VIDEOCACHEPATH stringByAppendingPathComponent:mediaName];    model.name    = mediaName;    model.type    = @"moive";    model.isUploaded = NO;    //將model存入待上傳數組    [self.uploadArray addObject:model];  }  //[picker dismissViewControllerAnimated:YES completion:nil];}- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {  [picker dismissViewControllerAnimated:YES completion:nil];}

以上所述是小編給大家介紹的iOS實現視頻和圖片的上傳思路,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情啊啊啊| 136fldh精品导航福利| 欧美性猛交xxxx偷拍洗澡| 日韩精品日韩在线观看| 欧美大秀在线观看| 色综合久久88| 日韩精品一区二区三区第95| 国产精品欧美久久久| 国产精品永久免费观看| 九九久久综合网站| 国产一区二区三区视频免费| 久久色精品视频| 91在线免费视频| 亚洲欧美日韩高清| 国产免费一区二区三区在线观看| 亚洲精品乱码久久久久久按摩观| 97视频在线观看亚洲| 亚洲精品视频二区| 亚洲人成电影网站色xx| 久久精品视频在线| 奇米一区二区三区四区久久| 久久久久久久影视| 91中文字幕在线观看| 国产精品久久久久久一区二区| 久久艳片www.17c.com| 中文字幕精品视频| 亚洲黄色免费三级| 91精品国产成人www| 欧美日韩裸体免费视频| 国产偷国产偷亚洲清高网站| 国模极品一区二区三区| 欧美诱惑福利视频| 欧美性猛交xxxx黑人猛交| 成人黄色av网站| 亚洲自拍另类欧美丝袜| 亚洲色图欧美制服丝袜另类第一页| 成人精品一区二区三区电影黑人| 川上优av一区二区线观看| 国产精品美女网站| 欧美日韩在线第一页| 久热精品在线视频| 成人欧美一区二区三区在线| 亚洲欧美一区二区三区在线| 日韩三级成人av网| 亚洲国产精品999| 亚洲精品一区二区三区婷婷月| 亚洲精选中文字幕| 国产91露脸中文字幕在线| 日韩av在线免费| 久久深夜福利免费观看| 美日韩丰满少妇在线观看| 九九热最新视频//这里只有精品| 亚洲a级在线播放观看| 国产成人综合久久| 亚洲精品福利免费在线观看| 欧美性猛交xxxx免费看久久久| 中文字幕在线观看日韩| 97在线看免费观看视频在线观看| 日韩网站在线观看| 精品久久久久久中文字幕大豆网| 久久久黄色av| 国产91精品最新在线播放| 亚洲一区二区日本| 日本一区二区三区四区视频| 欧美天天综合色影久久精品| 欧美视频一区二区三区…| 人人做人人澡人人爽欧美| 亚洲色图偷窥自拍| 日韩av在线天堂网| 韩国精品久久久999| 精品久久久久国产| 欧美日韩性生活视频| 国产女人18毛片水18精品| 亚洲电影免费观看高清| www.亚洲天堂| 国产欧美韩国高清| 少妇激情综合网| 91热精品视频| 国产成人精品一区二区在线| 欧美疯狂性受xxxxx另类| 欧美性20hd另类| 欧美性生交xxxxx久久久| 97欧美精品一区二区三区| 亚洲激情免费观看| 91日韩在线视频| 国产精品免费看久久久香蕉| 91丨九色丨国产在线| 日韩精品在线观看视频| 欧美日韩中文字幕在线| 中文字幕自拍vr一区二区三区| 亚洲一区二区少妇| 国产精品一区二区久久久| 国模吧一区二区三区| 亚洲人成网站777色婷婷| 欧美日韩xxxxx| 日韩精品在线播放| 欧美成人激情在线| 成人免费大片黄在线播放| 亚洲新中文字幕| 国产日韩在线精品av| 欧美一区二区视频97| 国产91在线高潮白浆在线观看| 亚洲欧美资源在线| 欧美最猛性xxxxx(亚洲精品)| 欧美日韩日本国产| 欧美日产国产成人免费图片| 亚洲色图国产精品| 亚洲性生活视频在线观看| 亚洲精品国产免费| 欧美放荡办公室videos4k| 社区色欧美激情 | 亚洲国产成人爱av在线播放| 黄色成人在线免费| 久久6免费高清热精品| 国产精品精品一区二区三区午夜版| 国产91精品最新在线播放| 影音先锋日韩有码| 亚洲精品视频久久| 91九色国产社区在线观看| 欧美性高跟鞋xxxxhd| 国产精品91久久久| 中文字幕日韩精品有码视频| 欧洲一区二区视频| 欧美成人中文字幕在线| 亚洲精品一区久久久久久| 精品国产乱码久久久久久虫虫漫画| 亚洲一区国产精品| 亚洲成人黄色在线观看| 2024亚洲男人天堂| 亲子乱一区二区三区电影| 91在线观看免费高清| 国产在线a不卡| 国产精品美女免费看| 日韩欧美在线网址| 国产精品人成电影在线观看| 亚洲一区美女视频在线观看免费| 最新91在线视频| 神马久久久久久| 亚洲最大中文字幕| 欧美亚洲国产成人精品| 亚洲欧美日韩中文在线| 亚洲第一福利在线观看| 精品国产91久久久久久| 全色精品综合影院| 亚洲欧美日本精品| 亚洲欧洲在线视频| 欧美黑人性猛交| 中文字幕欧美精品在线| 亚洲成人国产精品| 亚洲精品视频在线播放| 在线观看日韩av| 性色av一区二区三区在线观看| 麻豆一区二区在线观看| 日本亚洲精品在线观看| 影音先锋日韩有码| 亚洲欧美视频在线| 尤物九九久久国产精品的分类| 亚洲精品免费在线视频| 蜜臀久久99精品久久久久久宅男| 中文日韩在线视频| 日韩久久精品电影| 亚洲电影免费观看| 一区二区亚洲欧洲国产日韩| 亚洲免费电影一区|