AFNetworking實現POST上傳文件——圖片、.json、MP4,,,,,等各種類型。

轉自:https://blog.csdn.net/u013087513/article/details/49561535

導入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文件,複製網址即爲上傳的網址:

具體代碼實現如下:

//
//  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

第一種方式上傳圖片後,打開本地服務器存放上傳文件的文件夾如下:

 

第二種方式上傳圖片後,打開本地服務器存放上傳文件的文件夾如下:

 

AFN總結:


 AFN小結:

 功能:

 - 對NSURLSession和NSURLConnection的封裝

 - 提供了反序列化的方法

 - 提供了完善的錯誤處理機制

 

 在網絡開發中,最大變化的部分-->NSURLRequest

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

 2、請求體。

     -  內容的類型 Content-Type  POST上傳

     - 瀏覽器的類型
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章