天天看點

iOS--AFN檔案上傳

1. AFN上傳檔案的方法主要為:

  A.[formData appendPartWithFileURL:[NSURL fileURLWithPath:@""] name:@"file" error:nil];

B.[formData appendPartWithFileURL:[NSURL fileURLWithPath:@""] name:@"file" fileName:@"xxx.png" mimeType:@"image/png" error:nil];

2.AFN 下載下傳圖檔需要了解的知識點,伺服器傳回的什麼類型的資料,就用什麼類型來解析。

-(void)download{ //下載下傳圖檔

        AFHTTPSessionManager *mgr = [AFHTTPSessionManagermanager];

        mgr.responseSerializer = [AFHTTPResponseSerializer serializer];//解析除了JSON和XML的資料,即伺服器傳回的原類型的資料。

mgr.responseSerializer = [AFJSONResponseSerializerserializer];//JSON解析。

        mgr.responseSerializer = [AFXMLParserResponseSerializerserializer];//XML解析。

        [mgr GET:@"http://img03.tooopen.com/images/20160630/tooopen_sy_168334097794.jpg"parameters:nilprogress:nilsuccess:^(NSURLSessionDataTask *_Nonnull task,id  _Nullable responseObject) {

                NSLog(@"responseObject%@",responseObject);

                _showImage.image = [UIImageimageWithData:responseObject];

        } failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) {

                NSLog(@"error%@",error);

        }];

}

3.AFN讓線程不死的舉例:

[self performSelector:@selector( ) onThread: withObject:nil waitUntilDone:NO modes:[self.rumloopModes allObjects]];

4.開始網絡監控AFN

-(void)watchTheNetworkStatus{

        //開始網絡監控

        AFNetworkReachabilityManager *mgr = [AFNetworkReachabilityManagersharedManager];

//        AFNetworkReachabilityStatusUnknown          = -1,

//        AFNetworkReachabilityStatusNotReachable     = 0,  沒有網絡

//        AFNetworkReachabilityStatusReachableViaWWAN = 1, 4G

//        AFNetworkReachabilityStatusReachableViaWiFi = 2, WIFI

        [mgr setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {

                NSLog(@"%ld",(long)status);

        }];

  mgr.networkReachabilityStatus = ; //可以用來拿到目前網絡。

        [mgr startMonitoring];

}

5.系統自帶的監控網絡的方法

- (void)appleMonitoring

{

    // 監聽通知

    [[NSNotificationCenterdefaultCenter] addObserver:selfselector:@selector(getNetworkStatus)name:kReachabilityChangedNotificationobject:nil];

        //object為nil表示隻要有人發出通知就執行。

    // 開始監控網絡

    self.reachability = [ReachabilityreachabilityForInternetConnection];

    [self.reachabilitystartNotifier];

}

- (void)dealloc

{

    [[NSNotificationCenterdefaultCenter] removeObserver:self];

    [self.reachabilitystopNotifier];

    self.reachability =nil;

}

- (void)getNetworkStatus

{

    if ([ReachabilityreachabilityForLocalWiFi].currentReachabilityStatus !=NotReachable) {

        NSLog(@"是wifi");

    } elseif ([ReachabilityreachabilityForInternetConnection].currentReachabilityStatus !=NotReachable) {

        NSLog(@"是手機自帶網絡");

    } else {

        NSLog(@"網絡有問題");

    }

}

6.上傳照片

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

    UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"請選擇圖檔" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"拍照", @"相冊", nil];

    [sheet showInView:self.view.window];

}

#pragma mark - UIActionSheet

- (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];

}

#pragma mark - UIImagePickerControllerDelegate

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info

{

    // 銷毀控制器

    [picker dismissViewControllerAnimated:YES completion:nil];

    // 獲得圖檔

    UIImage *image = info[UIImagePickerControllerOriginalImage];

    // 顯示圖檔

    self.imageView.image = image;

}

- (void)upload1

{

    // 1.建立一個管理者

    AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];

    // 2.封裝參數(這個字典隻能放非檔案參數)

    NSMutableDictionary *params = [NSMutableDictionary dictionary];

    params[@"username"] = @"123";

    params[@"age"] = @20;

    params[@"pwd"] = @"456";

    params[@"height"] = @1.55;

    // 2.發送一個請求

    NSString *url = @"http://localhost:8080/MJServer/upload";

    [mgr POST:url parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {

        // 在發送請求之前會自動調用這個block

        // 需要在這個block中添加檔案參數到formData中

        NSURL *url = [[NSBundle mainBundle] URLForResource:@"itcast" withExtension:@"txt"];

        [formData appendPartWithFileURL:url name:@"file" fileName:@"test.txt" mimeType:@"text/plain" error:nil];

        //        UIImage *image = [UIImage imageNamed:@"minion_01"];

        //        NSData *fileData = UIImagePNGRepresentation(image);

        //        [formData appendPartWithFileData:fileData name:@"file" fileName:@"haha.png" mimeType:@"image/png"];

    } success:^(AFHTTPRequestOperation *operation, id responseObject) {

        NSLog(@"上傳成功");

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

        NSLog(@"上傳失敗");

    }];

}

- (IBAction)upload {

    if (self.imageView.image == nil) return;

    // 1.建立一個管理者

    AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];

    // 2.封裝參數(這個字典隻能放非檔案參數)

    NSMutableDictionary *params = [NSMutableDictionary dictionary];

    params[@"username"] = @"123";

    params[@"age"] = @20;

    params[@"pwd"] = @"456";

    params[@"height"] = @1.55;

    // 2.發送一個請求

    NSString *url = @"http://192.168.15.172:8080/MJServer/upload";

    [mgr POST:url parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {

        NSData *fileData = UIImageJPEGRepresentation(self.imageView.image, 1.0);

        [formData appendPartWithFileData:fileData name:@"file" fileName:@"haha.jpg" mimeType:@"image/jpeg"];

        // 不是用這個方法來設定檔案參數

//        [formData appendPartWithFormData:fileData name:@"file"];

    } success:^(AFHTTPRequestOperation *operation, id responseObject) {

        NSLog(@"上傳成功");

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

        NSLog(@"上傳失敗");

    }];

    // 檔案下載下傳,檔案比較大,斷點續傳技術:普遍所有的HTTP伺服器都支援

    // 檔案上傳,檔案比較大,斷點續傳技術:一般的HTTP伺服器都不支援,常用的技術用的是Socket(TCP\IP、UDP)

}