课堂笔记—— post 上传

- (void)btnLoad_Touch:(id)sender {

 

    // 接收文件上传的地址

    NSString *urlString = @"http://localhost/BookReaderData/UploadFileWithPost.php";

    

    // 要上传的文件的文件名

    NSString *folder = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

    NSString *fileName = [folder stringByAppendingPathComponent:@"img3.jpg"];

    NSLog(@"Post filename is %@", fileName);  /**fileName设置为上传文件的文件名(可以虚构)**/

    

    

    

    // 服务器端上传表单项的名称,一定与服务器端接收文件的名一致

    NSString *uploadInputFieldName = @"file";  /**将file改为上传文件的参数名**/

    

    // 要传递的POST的参数,其中file对应上传文件的文件名

    NSDictionary *params = @{

                             uploadInputFieldName: fileName,

                             @"key1": @"Value1"                 // 其他要POST传递的参数

                             };

    

    

    /******文件转为NSData*******/

    //要上传的文件

    NSString *imageFileName = [params objectForKey:uploadInputFieldName];

    

    //得到图片的data

    NSData* data = [NSData dataWithContentsOfFile:imageFileName];/**NSData是上传文件的二进制内容**/

    /*************************/

    

    

    

    

    /*********************以上按需要修改,下面的代码为固定代码,一般不需要修改*************************/

    

    

    //分界线的标识符

    NSString *TWITTERFON_FORM_BOUNDARY = @"AaB03x";

    //根据url初始化request

    NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]

                                                           cachePolicy:NSURLRequestReloadIgnoringLocalCacheData

                                                       timeoutInterval:10];

    //分界线 --AaB03x

    NSString *MPboundary=[[NSString alloc]initWithFormat:@"--%@",TWITTERFON_FORM_BOUNDARY];

    //结束符 AaB03x--

    NSString *endMPboundary=[[NSString alloc]initWithFormat:@"%@--",MPboundary];

    

    

    

    

    

    

    

    

    

    

    //http body的字符串

    NSMutableString *body=[[NSMutableString alloc]init];

    //参数的集合的所有key的集合

    NSArray *keys= [params allKeys];

    

    //遍历keys

    for(int i=0;i<[keys count];i++)

    {

        //得到当前key

        NSString *key=[keys objectAtIndex:i];

        //如果key不是pic,说明value是字符类型,比如name:Boris

        if(![key isEqualToString:uploadInputFieldName])

        {

            //添加分界线,换行

            [body appendFormat:@"%@\r\n",MPboundary];

            //添加字段名称,换2行

            [body appendFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",key];

            //添加字段的值

            [body appendFormat:@"%@\r\n",[params objectForKey:key]];

        }

    }

    

    ////添加分界线,换行

    [body appendFormat:@"%@\r\n",MPboundary];

    //声明pic字段,文件名为boris.png

    [body appendFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n", uploadInputFieldName, fileName];

    //声明上传文件的格式

    [body appendFormat:@"Content-Type: image\r\n\r\n"];

    

    //声明结束符:--AaB03x--

    NSString *end=[[NSString alloc]initWithFormat:@"\r\n%@",endMPboundary];

    //声明myRequestData,用来放入http body

    NSMutableData *myRequestData=[NSMutableData data];

    //将body字符串转化为UTF8格式的二进制

    [myRequestData appendData:[body dataUsingEncoding:NSUTF8StringEncoding]];

    //将image的data加入

    [myRequestData appendData:data];

    //加入结束符--AaB03x--

    [myRequestData appendData:[end dataUsingEncoding:NSUTF8StringEncoding]];

    

    //设置HTTPHeader中Content-Type的值

    NSString *content=[[NSString alloc]initWithFormat:@"multipart/form-data; boundary=%@",TWITTERFON_FORM_BOUNDARY];

    //设置HTTPHeader

    [request setValue:content forHTTPHeaderField:@"Content-Type"];

    //设置Content-Length

    [request setValue:[NSString stringWithFormat:@"%ld", [myRequestData length]] forHTTPHeaderField:@"Content-Length"];

    //设置http body

    [request setHTTPBody:myRequestData];

    //http method

    [request setHTTPMethod:@"POST"];

    

    

    /**********************************/

    

    

    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];

    

    NSURLSessionDataTask *dataTash = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

        

        if (error) {

            NSLog(@"%@", error);

        }

        else {

            NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

            NSLog(@"Response is %@", responseString);

        }

    }];

    [dataTash resume];

}

posted @ 2015-10-30 10:17  破水杯  阅读(168)  评论(0编辑  收藏  举报