AFHTTPRequestOperationManager注意点
ActionSheet在控制器view上,因为点击拍照时,会modal出另外一个控制器,当前的控制器view就会从窗口中移除。就会报ActionSheet不在窗口上。
- (
void
)touchesBegan:(
NSSet
*)touches withEvent:(
UIEvent
*)event
{
UIActionSheet *sheet = [[ UIActionSheet alloc ] initWithTitle : @" 图片上传 " delegate: self cancelButtonTitle : @" 取消 " destructiveButtonTitle : nil otherButtonTitles : @" 拍照 " , @" 相册 " , nil ];
[sheet showInView : self . view ];
}
#pragma mark - 实现 UIActionSheetDelegate 代理方法
- ( void )actionSheet:( UIActionSheet *)actionSheet clickedButtonAtIndex:( NSInteger )buttonIndex
{
UIImagePickerController *ipc = [[ UIImagePickerController alloc ] init ];
ipc. delegate = self ;
switch (buttonIndex) {
case 0 :
if (![ UIImagePickerController isSourceTypeAvailable : UIImagePickerControllerSourceTypeCamera ]) return ;
ipc. sourceType = UIImagePickerControllerSourceTypeCamera ;
break ;
case 1 :
if (![ UIImagePickerController isSourceTypeAvailable : UIImagePickerControllerSourceTypePhotoLibrary ]) return ;
ipc. sourceType = UIImagePickerControllerSourceTypePhotoLibrary ;
break ;
default :
break ;
}
[ self presentViewController :ipc animated : YES completion : nil ];
}
{
UIActionSheet *sheet = [[ UIActionSheet alloc ] initWithTitle : @" 图片上传 " delegate: self cancelButtonTitle : @" 取消 " destructiveButtonTitle : nil otherButtonTitles : @" 拍照 " , @" 相册 " , nil ];
[sheet showInView : self . view ];
}
#pragma mark - 实现 UIActionSheetDelegate 代理方法
- ( void )actionSheet:( UIActionSheet *)actionSheet clickedButtonAtIndex:( NSInteger )buttonIndex
{
UIImagePickerController *ipc = [[ UIImagePickerController alloc ] init ];
ipc. delegate = self ;
switch (buttonIndex) {
case 0 :
if (![ UIImagePickerController isSourceTypeAvailable : UIImagePickerControllerSourceTypeCamera ]) return ;
ipc. sourceType = UIImagePickerControllerSourceTypeCamera ;
break ;
case 1 :
if (![ UIImagePickerController isSourceTypeAvailable : UIImagePickerControllerSourceTypePhotoLibrary ]) return ;
ipc. sourceType = UIImagePickerControllerSourceTypePhotoLibrary ;
break ;
default :
break ;
}
[ self presentViewController :ipc animated : YES completion : nil ];
}
注意:
如果在switch的case中定义一个局部变量,需要用大括号括住。
- ( void )imagePickerController:( UIImagePickerController *)picker didFinishPickingMediaWithInfo:( NSDictionary *)info
{
// 关闭 UIImagePickerController 控制器
[ self dismissViewControllerAnimated : YES completion : nil ];
NSLog ( @"%@" ,info);
// 获取图片
UIImage *image = info[ UIImagePickerControllerOriginalImage ];
self . imageV . image = image;
}
- (
IBAction
)upLoad
{
// 创建一个管理者
AFHTTPRequestOperationManager *manger = [ AFHTTPRequestOperationManager manager ];
// 设置参数
NSMutableDictionary *params = [ NSMutableDictionary dictionary ];
params[ @"username" ] = @"123" ;
params[ @"pwd" ] = @"123" ;
// 设置 URL
NSString *url = @"http://192.168.15.56:8080/MJServer/upload" ;
[manger POST :url parameters :params constructingBodyWithBlock :^( id < AFMultipartFormData > formData) {
{
// 创建一个管理者
AFHTTPRequestOperationManager *manger = [ AFHTTPRequestOperationManager manager ];
// 设置参数
NSMutableDictionary *params = [ NSMutableDictionary dictionary ];
params[ @"username" ] = @"123" ;
params[ @"pwd" ] = @"123" ;
// 设置 URL
NSString *url = @"http://192.168.15.56:8080/MJServer/upload" ;
[manger POST :url parameters :params constructingBodyWithBlock :^( id < AFMultipartFormData > formData) {
注意:
在发送请求之前会自动调用这个block
需要在这个block中添加文件参数到formData中
NSData *fileData = UIImageJPEGRepresentation ( self . imageV . image , 1.0 );
[formData appendPartWithFileData :fileData name : @"file" fileName : @"image.png" mimeType : @"image/png" ];
} success :^( AFHTTPRequestOperation *operation, id responseObject) {
NSLog ( @" 上传成功 " );
} failure :^( AFHTTPRequestOperation *operation, NSError *error) {
NSLog ( @" 上传失败 " );
}];
}
需要在这个block中添加文件参数到formData中
NSData *fileData = UIImageJPEGRepresentation ( self . imageV . image , 1.0 );
[formData appendPartWithFileData :fileData name : @"file" fileName : @"image.png" mimeType : @"image/png" ];
} success :^( AFHTTPRequestOperation *operation, id responseObject) {
NSLog ( @" 上传成功 " );
} failure :^( AFHTTPRequestOperation *operation, NSError *error) {
NSLog ( @" 上传失败 " );
}];
}
注意:
1.保留照片的质量
NSData
*fileData =
UIImageJPEGRepresentation
(
self
.
imageV
.
image
,
1.0
);
2.AFN不能监听文件的上传进度,ASI可以监听文件的上传进度。
3.需要上传的文件的具体数据
FileData : 需要上传的文件的具体数据
name : 服务器那边接收文件用的参数名
fileName : (告诉服务器)所上传文件的文件名
mimeType : 所上传文件的文件类型
name : 服务器那边接收文件用的参数名
fileName : (告诉服务器)所上传文件的文件名
mimeType : 所上传文件的文件类型
NSData
*fileData =
UIImageJPEGRepresentation
(
self
.
imageV
.
image
,
1.0
);
[formData appendPartWithFileData :fileData name : @"file" fileName : @"image.png" mimeType : @"image/png" ];
[formData appendPartWithFileData :fileData name : @"file" fileName : @"image.png" mimeType : @"image/png" ];
4.需要上传的文件的URL路径
FileURL : 需要上传的文件的URL路径
name : 服务器那边接收文件用的参数名
fileName : (告诉服务器)所上传文件的文件名
mimeType : 所上传文件的文件类型
NSURL *url = [[ NSBundle mainBundle ] URLForResource : @"itcast" withExtension : @"txt" ];
[formData appendPartWithFileURL :url name : @"file" fileName : @"test.txt" mimeType : @"text/plain" error : nil ];
name : 服务器那边接收文件用的参数名
fileName : (告诉服务器)所上传文件的文件名
mimeType : 所上传文件的文件类型
NSURL *url = [[ NSBundle mainBundle ] URLForResource : @"itcast" withExtension : @"txt" ];
[formData appendPartWithFileURL :url name : @"file" fileName : @"test.txt" mimeType : @"text/plain" error : nil ];