ios利用 AFN 上傳相冊或者拍照圖片
由于項目中多處需要上傳圖片,我們可以自定義上傳圖片請求,自定義調(diào)取相冊及拍照,方便多處使用時調(diào)用。
主要步驟:
1.第一步:請求上傳你選取的相冊圖片或者拍照圖片(經(jīng)過壓縮處理)
2.第二步:獲取到第一步圖片url上傳給服務(wù)器
3.第三步:回顯圖片(當(dāng)然進(jìn)入該界面時先判斷是否有圖片,無圖則展示占位圖片,否則就回顯圖片)
廢話不多說,直接上代碼:
1)封裝的上傳圖片的網(wǎng)絡(luò)請求(圖片壓縮) QTXUploadImage 文件
// 利用 afn 上傳一張圖片 #import <Foundation/Foundation.h> @interface QTXUploadImage : NSObject // 上傳圖片的網(wǎng)絡(luò)請求(圖片壓縮) + (void)post:(NSString *)url image:(UIImage *)image name:(NSString *)name success:(void (^)(id json))success failure:(void (^)(NSError *error))failure; @end
#import "QTXUploadImage.h"
#import "AFNetworking.h"
#import "QTXAccount.h"
#import "QTXAccountTool.h"
@implementation QTXUploadImage
/**
* 上傳圖片的網(wǎng)絡(luò)請求(圖片壓縮)
*
* @param url 上傳圖片的網(wǎng)絡(luò)請求地址
* @param name 和后臺包名一致
*
*/
+ (void)post:(NSString *)url image:(UIImage *)image name:(NSString *)name success:(void (^)(id json))success failure:(void (^)(NSError *error))failure {
// 1.創(chuàng)建網(wǎng)絡(luò)管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 2.拼接請求參數(shù)url 也可在具體控制器請求里傳入
NSDictionary *dict = @{@"userId" : [QTXAccountTool account].userId};
// 3.發(fā)送請求
[manager POST:url parameters:dict constructingBodyWithBlock:
^void(id<AFMultipartFormData> formData) {
NSData *imageData = UIImageJPEGRepresentation(image, 0.5);//進(jìn)行圖片壓縮
// 使用日期生成圖片名稱
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyyMMddHHmmss";
NSString *fileName = [NSString stringWithFormat:@"%@.png",[formatter stringFromDate:[NSDate date]]];
// 任意的二進(jìn)制數(shù)據(jù)MIMEType application/octet-stream
[formData appendPartWithFileData:imageData name:name fileName:fileName mimeType:@"image/png"];
} success:^void(NSURLSessionDataTask * task, id responseObject) {
if (success) {
success(responseObject);
}
} failure:^void(NSURLSessionDataTask * task, NSError * error) {
if (failure) {
failure(error);
}
}];
}
@end
2)封裝的拍照/從相冊選擇 QTXImagePicker 文件
// 拍照/從相冊選擇
#import <Foundation/Foundation.h>
typedef void(^QTXImagePickerFinishAction)(UIImage *image);
@interface QTXImagePicker : NSObject
/**
@param viewController 用于present UIImagePickerController對象
@param allowsEditing 是否允許用戶編輯圖像
*/
+ (void)showImagePickerFromViewController:(UIViewController *)viewController
allowsEditing:(BOOL)allowsEditing
finishAction:(QTXImagePickerFinishAction)finishAction;
@end
#import "QTXImagePicker.h"
@interface QTXImagePicker()<UIActionSheetDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate>
@property (nonatomic, weak) UIViewController *viewController;
@property (nonatomic, copy) QTXImagePickerFinishAction finishAction;
@property (nonatomic, assign) BOOL allowsEditing;
@end
static QTXImagePicker *qtxImagePickerInstance = nil;
@implementation QTXImagePicker
+ (void)showImagePickerFromViewController:(UIViewController *)viewController allowsEditing:(BOOL)allowsEditing finishAction:(QTXImagePickerFinishAction)finishAction {
if (qtxImagePickerInstance == nil) {
qtxImagePickerInstance = [[QTXImagePicker alloc] init];
}
[qtxImagePickerInstance showImagePickerFromViewController:viewController
allowsEditing:allowsEditing
finishAction:finishAction];
}
- (void)showImagePickerFromViewController:(UIViewController *)viewController
allowsEditing:(BOOL)allowsEditing
finishAction:(QTXImagePickerFinishAction)finishAction {
_viewController = viewController;
_finishAction = finishAction;
_allowsEditing = allowsEditing;
UIActionSheet *sheet = nil;
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
sheet = [[UIActionSheet alloc] initWithTitle:nil
delegate:self
cancelButtonTitle:@"取消"
destructiveButtonTitle:nil
otherButtonTitles:@"拍照", @"從相冊選擇", nil];
}else {
sheet = [[UIActionSheet alloc] initWithTitle:nil
delegate:self
cancelButtonTitle:@"取消"
destructiveButtonTitle:nil
otherButtonTitles:@"從相冊選擇", nil];
}
UIView *window = [UIApplication sharedApplication].keyWindow;
[sheet showInView:window];
}
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
NSString *title = [actionSheet buttonTitleAtIndex:buttonIndex];
if ([title isEqualToString:@"拍照"]) {
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
picker.allowsEditing = _allowsEditing;
[_viewController presentViewController:picker animated:YES completion:nil];
}else if ([title isEqualToString:@"從相冊選擇"]) {
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
// [picker.navigationBar setBarTintColor:QTXNavColor]; // 修改相冊的導(dǎo)航條的背景顏色
picker.delegate = self;
picker.allowsEditing = YES;
picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
[_viewController presentViewController:picker animated:YES completion:nil];
}else {
qtxImagePickerInstance = nil;
}
}
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
UIImage *image = info[UIImagePickerControllerEditedImage];
if (image == nil) {
image = info[UIImagePickerControllerOriginalImage];
}
if (_finishAction) {
_finishAction(image);
}
[picker dismissViewControllerAnimated:YES completion:^{}];
qtxImagePickerInstance = nil;
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
if (_finishAction) {
_finishAction(nil);
}
[picker dismissViewControllerAnimated:YES completion:^{}];
qtxImagePickerInstance = nil;
}
@end
當(dāng)使用時,在所需使用的控制器里調(diào)用:
[QTXImagePicker showImagePickerFromViewController:self allowsEditing:YES finishAction:^(UIImage *image) {
if (image) {
self.idSideImage = image;
[QTXUploadImage post:QTX_xsz1Url image:image name:@"xsz1" success:^(id json) {
// 第一步請求上傳
QTXLog(@"圖像上傳請求成功 %@", json);
self.idSide = json[@"data"];
} failure:^(NSError *error) {
QTXLog(@"學(xué)生證圖像上傳請求失敗 %@", error);
}];
}
}];
第二步和第三步 需要和各位自己后臺server聯(lián)調(diào),就屬于普通的get/post請求了,這邊就不放代碼了喲
插一下,我們產(chǎn)品沒讓拍照的照片存儲到相冊
// 存儲圖片名稱:001.png ~ 009.png
for (int i = 1; i<=9; i++) {
UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"00%d.png", i]];
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
[NSThread sleepForTimeInterval:1];
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
微信JSSDK多圖片上傳并且解決IOS系統(tǒng)上傳一直加載的問題
這篇文章主要介紹了微信JSSDK多圖片上傳并且解決IOS系統(tǒng)上傳一直加載的問題的相關(guān)資料,需要的朋友可以參考下2016-03-03
解決ios手機(jī)中input輸入框光標(biāo)過長的問題
在項目中做移動端頁面,發(fā)現(xiàn)IOS 的光標(biāo)大小很大,和安卓的完全不一樣,怎么來調(diào)整大小呢?下面小編給大家?guī)砹薸os手機(jī)中input輸入框光標(biāo)過長問題的解決方法,一起看看吧2018-08-08
為textView添加語音輸入功能的實例代碼(集成訊飛語音識別)
下面小編就為大家分享一篇為textView添加語音輸入功能的實例代碼(集成訊飛語音識別),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01

