1. 程式人生 > >iOS表單上傳附件及引數到伺服器

iOS表單上傳附件及引數到伺服器

post有兩種上傳方式,這裡只列舉上傳附件的方式(這種請求方式支援檔案或檔案&普通引數或普通引數)即:

Content-Type = multipart/form-data;

該種類型有固定的引數拼接格式

普通引數

--boundry\r\n

Content-Disposition: form-data; name=\"%@\"\r\n

\r\n

value

\r\n

檔案引數

--boundry\r\n

Content-Disposition:form-data; name=\"%@\"; filename=\"%@\"\r\nContent-Type: %@\r\n

\r\n

data

\r\n

引數結尾

--boundry--\r\n

其中

name 即為表單請求欄位(服務端要的引數欄位),fileName為儲存在服務端的檔名字,Content-Type為檔案型別(image/png 或者

video/mpeg4等等),具體可以檢視Content-Type參照表

這裡著重說下即使服務端要引數是int型別,這裡也必須普通引數也必須是字串物件

#define TEST_FORM_BOUNDARY @"test1234"

#define BMEncode(str) [str dataUsingEncoding:NSUTF8StringEncoding]


-(void)sendPost:(NSString*)urlStr Paramater:(NSDictionary*)para data:(NSData*)data name:(NSString*)fileName andContentType:(

NSString *)cotentype

{

NSMutableData *dataM = [NSMutableDatadata];

/* 普通引數*/

    [para enumerateKeysAndObjectsUsingBlock:^(id_Nonnull key, id_Nonnull obj, BOOL *_Nonnull stop) {

NSString *boundry = [NSStringstringWithFormat:@"--%@\r\n",TEST_FORM_BOUNDARY];

        [dataM appendData:BMEncode(boundry)];

NSString *disposition = [NSStringstringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n",key];

NSLog(@"%@",disposition);

        [dataM appendData:BMEncode(disposition)];

        [dataM appendData:BMEncode(@"\r\n")];

        [dataM appendData:BMEncode(obj)];

        [dataM appendData:BMEncode(@"\r\n")];

    }];

/* 普通引數*/

/* 檔案引數*/

if(data&&data.length>0)

    {

NSString *boundry = [NSStringstringWithFormat:@"--%@\r\n",TEST_FORM_BOUNDARY];

        [dataM appendData:BMEncode(boundry)];

NSString *disposition=[NSStringstringWithFormat:@"Content-Disposition:form-data; name=\"uploadfile\"; filename=\"%@\"\r\nContent-Type: %@\r\n\r\n",fileName,cotentype];

NSLog(@"%@",disposition);

        [dataM appendData:BMEncode(disposition)];

        [dataM appendData:data];

        [dataM appendData:BMEncode(@"\r\n")];

    }

/* 檔案引數*/

//尾部的分隔符

NSString *strBottom = [NSStringstringWithFormat:@"--%@--\r\n",TEST_FORM_BOUNDARY];

    [dataM appendData:BMEncode(strBottom)];

NSURL *url = [NSURLURLWithString:urlStr];

NSMutableURLRequest *request = [[NSMutableURLRequestalloc]initWithURL:url];

    [request setValue:@"ZYB"forHTTPHeaderField:@"User-Agent"];

    [request setValue:@"max-age=7200"forHTTPHeaderField:@"Cache-Control"];

//設定上傳資料的長度及格式

    [request setValue:[NSStringstringWithFormat:@"multipart/form-data; boundary=%@",TEST_FORM_BOUNDARY]forHTTPHeaderField:@"Content-Type"];

    [request setValue:[NSStringstringWithFormat:@"%lu",(unsignedlong)dataM.length]forHTTPHeaderField:@"Content-Length"];

    [request setHTTPMethod:@"POST"];

    [request setHTTPBody:dataM];

//建立會話

NSURLSession *session = [NSURLSessionsharedSession];

NSURLSessionUploadTask *updataTask = [sessionuploadTaskWithRequest:requestfromData:dataM completionHandler:^(NSData *_Nullable data, NSURLResponse *_Nullable response, NSError * _Nullable error) {

if (!error) {

NSLog(@"response:%@",response);

NSString *dataStr = [[NSStringalloc]initWithData:dataencoding:NSUTF8StringEncoding];

NSLog(@"dataStr:%@",dataStr);

        }else{

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

        }

    }];

    [updataTask resume];

}