Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 向服务器发送多个数据_Objective C_Http Post_Nsurlconnection_Multipartform Data - Fatal编程技术网

Objective c 向服务器发送多个数据

Objective c 向服务器发送多个数据,objective-c,http-post,nsurlconnection,multipartform-data,Objective C,Http Post,Nsurlconnection,Multipartform Data,我设法向服务器发送了一些带有图像数据的字符串。但是,包含图像的数组有多个对象。我完全可以从服务器获取第一个映像,但其余的映像似乎消失了。是否有任何方法将多个数据文件发送到服务器,或者在我的for循环中发送图像是否有任何错误?服务器端代码似乎工作得很好,因为它获得了字符串和第一个图像文件,所以我认为代码的objective-c部分一定出了问题 NSString *urlString = @"http://www.somesite.com/cgi-bin/somefile.py"; NSMutab

我设法向服务器发送了一些带有图像数据的字符串。但是,包含图像的数组有多个对象。我完全可以从服务器获取第一个映像,但其余的映像似乎消失了。是否有任何方法将多个数据文件发送到服务器,或者在我的for循环中发送图像是否有任何错误?服务器端代码似乎工作得很好,因为它获得了字符串和第一个图像文件,所以我认为代码的objective-c部分一定出了问题

NSString *urlString = @"http://www.somesite.com/cgi-bin/somefile.py";

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"POST"];

NSString *boundary = @"---------------------------14737809831466499882746641449";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
[request addValue:contentType forHTTPHeaderField: @"Content-Type"];

NSMutableData *body = [NSMutableData data];

NSString *filenames = [NSString stringWithFormat:@"some string"]; //set name here
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"sessionString\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[filenames dataUsingEncoding:NSUTF8StringEncoding]];

[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userEmail\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[sharedSingletonCenter.emailString dataUsingEncoding:NSUTF8StringEncoding]];

[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];

for (int i = 0; i < [self.pagesArray count]; i++) {
    NSData* imageData = UIImagePNGRepresentation(self.pagesArray[i]);
    NSLog(@"added %i", i+1);
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"file_%i\"; filename=\".png\"\r\n", i + 1] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[NSData dataWithData:imageData]];
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    }

// setting the body of the post to the reqeust
[request setHTTPBody:body];

[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];

NSLog(@"%@", returnString);
NSLog(@"finish");
NSString*urlString=@”http://www.somesite.com/cgi-bin/somefile.py";
NSMutableURLRequest*请求=[[NSMutableURLRequest alloc]init];
[请求设置URL:[NSURL URLWithString:urlString]];
[请求设置HttpMethod:@“POST”];
NSString*boundary=@“------------------------------------14737809831466499882746641449”;
NSString*contentType=[NSString stringWithFormat:@“多部分/表单数据;边界=%@”,边界];
[请求addValue:contentType for HttpHeaderField:@“内容类型”];
NSMutableData*正文=[NSMutableData];
NSString*文件名=[NSString stringWithFormat:@“某些字符串”]//在这里设置名称
[body appendData:[[NSString stringWithFormat:@“\r\n--%@\r\n”,边界]数据使用编码:NSUTF8StringEncoding];
[body appendData:[[NSString stringWithFormat:@“内容处置:表单数据;名称=\“sessionString\”\r\n\r\n“]dataUsingEncoding:NSUTF8StringEncoding];
[body appendData:[filenames dataUsingEncoding:NSUTF8StringEncoding];
[body appendData:[[NSString stringWithFormat:@“\r\n--%@\r\n”,边界]数据使用编码:NSUTF8StringEncoding];
[body appendData:[[NSString stringWithFormat:@“内容处置:表单数据;名称=\“userEmail\”\r\n\r\n“]dataUsingEncoding:NSUTF8StringEncoding];
[body appendData:[sharedSingletonCenter.emailString数据使用编码:NSUTF8StringEncoding];
[body appendData:[[NSString stringWithFormat:@“\r\n--%@\r\n”,边界]数据使用编码:NSUTF8StringEncoding];
对于(int i=0;i<[self.pagesArray count];i++){
NSData*imageData=UIImagePNGRepresentation(self.pagesArray[i]);
NSLog(@“添加了%i”,i+1);
[body appendData:[[NSString stringWithFormat:@“内容处理:表单数据;名称=\“文件名=\”.png\“\r\n”,i+1]数据使用编码:NSUTF8StringEncoding];
[body appendData:[@“内容类型:应用程序/八位字节流\r\n\r\n”数据使用编码:NSUTF8StringEncoding];
[正文附录数据:[NSData dataWithData:imageData]];
[body appendData:[[NSString stringWithFormat:@“\r\n--%@--\r\n”,边界]数据使用编码:NSUTF8StringEncoding];
}
//将立柱主体设置为要求
[请求setHTTPBody:body];
[[UIApplication sharedApplication]设置网络活动指示器可见:是];
NSData*returnData=[NSURLConnection sendSynchronousRequest:request returningResponse:nil错误:nil];
NSString*returnString=[[NSString alloc]initWithData:returnData编码:NSUTF8StringEncoding];
NSLog(@“%@”,返回字符串);
NSLog(@“完成”);

问题在于多部分表单元素用

[NSString stringWithFormat:@"\r\n--%@\r\n",boundary]
但后来以

[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary]
但是您要在每个文件的末尾插入终止边界字符串。您希望更改代码,使其仅在最后执行。因此:

NSMutableData *body = [NSMutableData data];

NSString *filenames = [NSString stringWithFormat:@"some string"]; //set name here
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"sessionString\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[filenames dataUsingEncoding:NSUTF8StringEncoding]];

[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userEmail\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[sharedSingletonCenter.emailString dataUsingEncoding:NSUTF8StringEncoding]];

for (int i = 0; i < [self.pagesArray count]; i++) {
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    NSData* imageData = UIImagePNGRepresentation(self.pagesArray[i]);
    NSLog(@"added %i", i+1);
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"file_%i\"; filename=\".png\"\r\n", i + 1] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[NSData dataWithData:imageData]];
}

[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];

// setting the body of the post to the reqeust
[request setHTTPBody:body];
NSMutableData*body=[NSMutableData];
NSString*文件名=[NSString stringWithFormat:@“某些字符串”]//在这里设置名称
[body appendData:[[NSString stringWithFormat:@“\r\n--%@\r\n”,边界]数据使用编码:NSUTF8StringEncoding];
[body appendData:[[NSString stringWithFormat:@“内容处置:表单数据;名称=\“sessionString\”\r\n\r\n“]dataUsingEncoding:NSUTF8StringEncoding];
[body appendData:[filenames dataUsingEncoding:NSUTF8StringEncoding];
[body appendData:[[NSString stringWithFormat:@“\r\n--%@\r\n”,边界]数据使用编码:NSUTF8StringEncoding];
[body appendData:[[NSString stringWithFormat:@“内容处置:表单数据;名称=\“userEmail\”\r\n\r\n“]dataUsingEncoding:NSUTF8StringEncoding];
[body appendData:[sharedSingletonCenter.emailString数据使用编码:NSUTF8StringEncoding];
对于(int i=0;i<[self.pagesArray count];i++){
[body appendData:[[NSString stringWithFormat:@“\r\n--%@\r\n”,边界]数据使用编码:NSUTF8StringEncoding];
NSData*imageData=UIImagePNGRepresentation(self.pagesArray[i]);
NSLog(@“添加了%i”,i+1);
[body appendData:[[NSString stringWithFormat:@“内容处理:表单数据;名称=\“文件名=\”.png\“\r\n”,i+1]数据使用编码:NSUTF8StringEncoding];
[body appendData:[@“内容类型:应用程序/八位字节流\r\n\r\n”数据使用编码:NSUTF8StringEncoding];
[正文附录数据:[NSData dataWithData:imageData]];
}
[body appendData:[[NSString stringWithFormat:@“\r\n--%@--\r\n”,边界]数据使用编码:NSUTF8StringEncoding];
//将立柱主体设置为要求
[请求setHTTPBody:body];

顺便说一下,您也可以使用
file[]
来构建数组,而不是使用
file\uu%i
作为字段名。它会导致一个稍微不同的结构(因此需要更改服务器),但对我来说更直观(而不是使用任意字段名)。这完全是个人喜好的问题,但我只是想建议另一种选择。我还衷心建议至少使用
sendSynchronousRequest
而不是
sendSynchronousRequest
(除非您已经在后台队列中执行此操作)。谢谢Rob,我将其更改为异步。效果更好。谢谢你的建议。根据你的评论,我还提出了一种不同的方法。我使用异步方式发送每张照片,并附带他们的唯一请求。现在速度更快了:)