Iphone 向服务器发送图像时,数据json不起作用

Iphone 向服务器发送图像时,数据json不起作用,iphone,ios,xcode,Iphone,Ios,Xcode,我尝试使用以下代码发布包含数据的图像。数据正在上载,但图像未上载 -(void)imageUpload { name=@"Har9233"; userId=@"2969"; cityId=@"1"; mobile=@"9888329329"; mobileVerify=@"no "; gender=@"1"; //NSString *imageData=@"12"; NSData *imageData = UIImageJPEG

我尝试使用以下代码发布包含数据的图像。数据正在上载,但图像未上载

-(void)imageUpload
{
    name=@"Har9233";
    userId=@"2969";
    cityId=@"1";
    mobile=@"9888329329";
    mobileVerify=@"no ";
    gender=@"1";

    //NSString *imageData=@"12";

    NSData *imageData = UIImageJPEGRepresentation(imageView.image, 1.0);
    NSMutableDictionary* _params = [[NSMutableDictionary alloc] init];

    [_params setObject:userId forKey:@"userId"];
    [_params setObject:name forKey:@"profileDisplayName"];
    [_params setObject:gender forKey:@"gender"];
    [_params setObject:cityId forKey:@"cityId"];
    [_params setObject:mobile forKey:@"mobile"];
    [_params setObject:mobileVerify forKey:@"isMobileVerified"];

    NSString *boundary = @"ghkyre–nhjfhdj-74f5f-gfg5-gggff";

    NSString* FileParamConstant =@"image";

    //
    NSURL* requestURL = [NSURL URLWithString:@"myurl"];

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
    [request setHTTPShouldHandleCookies:NO];
    [request setTimeoutInterval:30];
    [request setHTTPMethod:@"POST"];

    // set Content-Type in HTTP header
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
    [request setValue:contentType forHTTPHeaderField: @"Content-Type"];

    // post body
    NSMutableData *body = [NSMutableData data];

    // add params (all params are strings)
    for (NSString *param in _params) {
        [body appendData:[[NSString stringWithFormat:@"--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", param] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[[NSString stringWithFormat:@"%@\r\n", [_params objectForKey:param]] dataUsingEncoding:NSUTF8StringEncoding]];
    }

// add image data


if (imageData) 
{
        NSLog(@"2");
        [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"harryimg1.png\"\r\n",FileParamConstant] dataUsingEncoding:NSUTF8StringEncoding]];
       [body appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[NSData dataWithData:imageData]];
        [body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];       
}

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


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

// set the content-length
NSString *postLength = [NSString stringWithFormat:@"%d", [body length]];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];

// set URL
[request setURL:requestURL];
NSURLResponse *response;

NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:Nil];

NSDictionary *jsonResponseData = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:nil];
NSLog(@"DATA=%@",jsonResponseData);

}

我也遇到过同样的问题,并且一直在使用一个与您非常相似的代码。试试这个,它肯定有效,这就是我正在使用的:

- (NSString *)randomStringWithLength:(int)length
    {

        NSString *letters = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        NSMutableString *randomString = [NSMutableString stringWithCapacity:length];

        for (int i = 0; i < length; i++) {
            [randomString appendFormat: @"%C", [letters characterAtIndex: arc4random() % [letters length]]];
        }

        return randomString;
    }

-(BOOL)uploadImageFile:(NSString *)filename
    {
        NSMutableURLRequest *request= [[NSMutableURLRequest alloc] init];
        [request setURL:[NSURL URLWithString:@"yourUrl"]];

        [request setHTTPMethod:@"PUT"];
        NSString *boundary = [self randomStringWithLength:14];
        NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
        [request addValue:contentType forHTTPHeaderField: @"Content-Type"];
        NSMutableData *postbody = [NSMutableData data];
        NSData *data = [NSData dataWithContentsOfFile:filename];
        [postbody appendData:[NSData dataWithData:data]];
        [request setHTTPBody:postbody];

        NSURLResponse *urlResponse = nil;
        NSError *requestError = nil;
        NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&requestError];

        if (((NSHTTPURLResponse *)urlResponse).statusCode != 201) {
            NSLog(@"Unable to upload file: %@, response data: %@, response code: %i, request error: %@", [filename lastPathComponent], [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding], ((NSHTTPURLResponse *)urlResponse).statusCode, requestError);
            return NO;
        }

        NSLog(@"Uploading File Successful");
        return YES;

    }
-(NSString*)randomStringWithLength:(int)length
{
NSString*字母=@“abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzo123456789”;
NSMutableString*randomString=[NSMutableString stringWithCapacity:length];
for(int i=0;i
为了更准确地表达我的评论:

您的代码看起来几乎正确,但有几个问题:

首先,“边界分隔符”前面必须有CRLF。从概念上讲,前面的CRLF属于“边界分隔符”

其次,参数的“Content-Type”头不会有什么坏处

因此,我建议将以下内容从

// add params (all params are strings)
for (NSString *param in _params) {
    [body appendData:[[NSString stringWithFormat:@"--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", param] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"%@\r\n", [_params objectForKey:param]] dataUsingEncoding:NSUTF8StringEncoding]];
}

第四,您不应该将CRLF附加到二进制数据! 当输出包含二进制数据的零件时,请按照上面的行操作:如您所见,将参数值写入车身零件后,没有关闭CRLF

因此:

if (imageData) 
{
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"harryimg1.png\"\r\n",FileParamConstant] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[NSData dataWithData:imageData]];     
}
此外,您还省略了“闭合边界分隔符:

在最后一部分之后,添加以下内容:

[body appendData:[[NSString stringWithFormat:@"\r\n--%@--", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
不需要最后一次CRLF,但也不会造成伤害

编辑 进一步说明:

发送大数据时,不建议使用
NSURLConnection
的便捷类方法sendSynchronousRequest:。您最好实现NSURLConnection委托,它允许您在出现问题时取消请求,并提供更多控制

此外,这种方法使用
NSData
作为多部分/表单数据消息的请求主体。这要求while主体必须适合内存。这可能会导致内存问题。更健壮的方法将使用输入流作为请求体,但这种实现要复杂得多(实际上要复杂得多)


iOS7有一个新的API,在这里传输大文件应该更容易。请参阅
NSURLSession
NSURLSessionUploadTask

服务器端使用的代码的文档?您可以在此处发布一些服务器端代码吗?取消对行的注释
/[body appendData:[[NSString stringWithFormat:@”--%@--\r\n,boundary]dataUsingEncoding:NSUTF8StringEncoding]]可能会修复它。但是,您似乎不太确定如何设置多部分/表单数据:请仔细阅读。您没有正确设置多部分/表单数据消息(无边界)。我怀疑这“肯定有效”,因为你的身体将被解释为序言,因此被忽略。看,你确定没有边界吗?如果没有边界分隔符,我将如何成功地使用它?是的,post正文(多部分/表单数据正文)不包含以边界分隔符开头的部分,也不包含以闭合边界分隔符结尾的部分。你确定你的请求成功了吗?(这取决于文件的内容,因为它将被解释为边界)我认为您不需要手动设置开始和结束边界分隔符,因为一旦您设置它,它将形成标题字段内容类型-参考请参阅RFC 2046,第5.1.1节。第22页,第23页。您是说,
NSURLConnection
会自动添加多部分/表单数据消息的缺失片段吗?我从来没有听说过这样一个神奇的功能!你用包跟踪工具(比如tcpdump)确认你的断言了吗?我想知道为什么人们会投票反对。显然这对你不起作用?如果是,请告诉我你有什么问题!请注意,“手工”编写多部分消息非常容易出错。如果您有问题,请显示您的代码。
[body appendData:[[NSString stringWithFormat:@"\r\n--%@--", boundary] dataUsingEncoding:NSUTF8StringEncoding]];