AFNetworking实现POST上传文件——图片、.json、MP4,,,,,等各种类型。

导入AFNetworking框架后,使用步骤如下:

第一步:获取上传网址。如下所示:NSString *url =@"http://127.0.0.1/post/upload.php";

第二步:新建AFHTTPRequestOperationManager对象,具体如下:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManagermanager];

第三步:开始上传。上传有两种方式:

第一种方式上传无法执行上传到服务器后的文件名。但是第二种方式可以指定上传到服务器后的文件名。具体实现如下:

[manager POST:urlparameters:nilconstructingBodyWithBlock:^(id<AFMultipartFormData> formData) {

//要上传的图片路径

NSURL *fileUrl = [[NSBundlemainBundle]URLForResource:@"XXXX.png"withExtension:nil];

/*

上传方式一:

FileURL: 要上传的文件的url

name:上传到服务器,接受此图片的字段名。

这种方式,没有办法修改这个文件在服务器端的名字。

*/

// [formData appendPartWithFileURL:fileUrl name:@"userfile" error:NULL];

/**

上传方式二:

FileURL:要上传的文件的url

name:上传到服务器,接受这个图片的字段名

fileName:这个文件在服务器的名字。

mimeType:表示要上传的文件的类型。

mimeType的格式——大类/小类

JPG image/jpg

PNG image/png

JSON application/json

如果要上传别的文件类型,百度一下mimeType即可

mimeType参考手册文档的网址——>

http://www.w3school.com.cn/media/media_mimeref.asp

*/

[formData appendPartWithFileURL:fileUrlname:@"userfile"fileName:@"咪咪图.png"mimeType:@"image/png"error:nil];

} success:^(AFHTTPRequestOperation *operation,id responseObject) { //上传成功

} failure:^(AFHTTPRequestOperation *operation,NSError *error) { //上传失败

}];

需要注意的是:上传方法中的name指在服务器接受此文件的字段名,双击打开本地服务器的后台的upload.php。如下:


新建工程,具体实现如下:

首先打开本地服务器,用火狐打开upload.php文件,复制网址即为上传的网址:



具体代码实现如下:

<span style="font-size:18px;"><span style="font-size:18px;">//
//  ViewController.m
//  AFN的使用(需要重点掌握)
//
//  Created by apple on 15/10/31.
//  Copyright (c) 2015年 LiuXun. All rights reserved.
//

#import "ViewController.h"
#import "AFNetworking.h"
@interface ViewController ()

@end

@implementation ViewController

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self postUpLoad];
}

#pragma mark - 常规的方法
/**
 1、没有URL,只需指定一个url字符串即可。
 2、网络请求是异步,完成以后的回调代码块直接在主线程。
 3、已经实现了反序列化。
 4、如果get方法需要传递参数,可以使用字段的方式传递。程序员不需要关心url里面的格式。
 5、POST方法,如果需要传递参数,也可以以字典的形式传递。
 
 */

/**GET登录(一)*/
-(void)getLogin
{
    NSString *urlStr = @"http://127.0.0.1/login.php?username=zhangsan&password=zhang";
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    
    // GET 方法
    [manager GET:urlStr parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"%@ %@", responseObject, [NSThread currentThread] );
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"%@", error);
    }];
}

/**GET登录(二)*/
-(void)getLogin2
{
    NSString *urlStr = @"http://127.0.0.1/login.php";
    NSDictionary *params = @{@"password":@"zhang", @"username":@"zhangsan"};
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    [manager GET:urlStr parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"%@ %@", responseObject, [NSThread currentThread] );
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"%@", error);
    }];
}

/**POST登录*/
-(void)postLogin
{
    NSString *urlStr = @"http://127.0.0.1/login.php";
    NSDictionary *params = @{@"password":@"zhang", @"username":@"zhangsan"};
    AFHTTPRequestOperationManager  *manager = [AFHTTPRequestOperationManager manager];
    
    // POST 方法
    [manager POST:urlStr parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"%@ %@", responseObject, [NSThread currentThread] );
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"%@", error);
    }];
}

-(void)getDemo
{
    NSString *urlStr = @"http://127.0.0.1/videos.json";
    
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    
    // GET 方法
    [manager GET:urlStr parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        
        // 已经把反序列化完成的结果都直接返回了。可以直接更新UI。
        NSLog(@"%@ %@", responseObject, [NSThread currentThread]);
        NSArray *array = responseObject;
        for (NSDictionary *dict in array) {
            NSLog(@"%@", dict[@"desc"]);
        }
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"%@", error);
    }];
    
    NSLog(@"XXXXXX-------Finish");
}

#pragma mark- XML解析
/**
 请求的解析器
 requestSerizalizer:设置请求的数据体或数据格式的。即发送给服务器数据的格式。
 manager.requestSerializer = [AFHTTPRequestSerializer serializer];
 AFHTTPRequestSerializer:二进制的数据格式(默认的)。默认请求的是二进制数据格式
 AFJSONRequestSerializer:JSON
 AFPropertyListRequestSerializer:PList
 
 响应的解析器(默认直接解析JSON)
 manager.responseSerializer = [AFJSONResponseSerializer serializer];
 AFJSONResponseSerializer:JSON(默认格式,即如果不设置服务器返回数据的格式,默认返回的是JSON格式)
 AFJSONResponseSerializer:二进制数据,也可以返回二进制数据,一般在下载中使用。
 AFXMLParserResponseSerializer:XML的解析器(SAX方式解析)
 
 AFImageResponseSerializer:IMG 也就是说服务器可以返回图片(一般不使用,因为只要牵涉图片的网络处理就只使用SDWebImage进行处理)
 
 */
-(void)getXML
{
    NSString *urlStr = @"http://127.0.0.1/videos.xml";
    
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    
    // 指定我们的响应的解析器是XML(NSXMLParser:)也就是需要SAX方式手动解析
    manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
    
    /*
     假如我们想使用DOM进行解析,可以指定服务器返回数据的类型是二进制。
     manager.responseSerializer = [AFHTTPResponseSerializer serializer];
     */
    
    // GET 方法
    [manager GET:urlStr parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        
        // 已经把反序列化完成的结果都直接返回了。可以直接更新UI。
        NSLog(@"%@ %@", responseObject, [NSThread currentThread]);
        
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"%@", error);
    }];
    
    NSLog(@"XXXXXX-------Finish");
}

#pragma mark - POST上传图片
-(void)postUpLoad
{
    //  url
    NSString *url = @"http://127.0.0.1/post/upload.php";
    
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    
    [manager POST:url parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
        // 要上传的图片路径
        NSURL *fileUrl = [[NSBundle mainBundle] URLForResource:@"XXXX.png" withExtension:nil];
        
        /*
         上传方式一:
         FileURL: 要上传的文件的url
         name:上传到服务器,接受此图片的字段名。
         这种方式,没有办法修改这个文件在服务器端的名字。
         */
        //        [formData appendPartWithFileURL:fileUrl name:@"userfile" error:NULL];
        
        /**
         上传方式二:
         FileURL:要上传的文件的url
         name:上传到服务器,接受这个图片的字段名
         fileName:这个文件在服务器的名字。
         mimeType:表示要上传的文件的类型。
         mimeType的格式—— 大类/小类
         JPG  image/jpg
         PNG  image/png
         JSON application/json
        如果要上传别的文件类型,百度一下mimeType即可
         mimeType参考手册文档的网址——>
         http://www.w3school.com.cn/media/media_mimeref.asp
         */
        [formData appendPartWithFileURL:fileUrl name:@"userfile" fileName:@"咪咪图.png" mimeType:@"image/png" error:nil];
        
    } success:^(AFHTTPRequestOperation *operation, id responseObject) { // 上传成功
        
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { //上传失败
        
    }];
}

@end</span></span>
第一种方式上传图片后,打开本地服务器存放上传文件的文件夹如下:


第二种方式上传图片后,打开本地服务器存放上传文件的文件夹如下:

AFN总结:

AFN小结:

功能:

- NSURLSessionNSURLConnection的封装

- 提供了反序列化的方法

- 提供了完善的错误处理机制

在网络开发中,最大变化的部分-->NSURLRequest

1HTTP的方法:GET/POST/PUT/DELEGATE

2、请求体。

- 内容的类型 Content-Type POST上传

- 浏览器的类型


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值