NSURLConnection发送两次数据

时间:2012-05-16 10:23:54

标签: iphone objective-c image upload nsurlconnection

我正在将图片上传到我的服务器,当我上传图片时,我正在尝试向用户显示上传的进度条。但是在NSURLConnection委托方法connection: didSendBodyData: totalBytesWritten: totalBytesExpectedToWrite:中,我得到了令人困惑的数字。让我们说我的数据长X字节。起初我将totalBytesExpectedToWrite设为X,但是在totalBytesWritten达到totalBytesExpectedToWrite之后,我的连接仍然继续上传,并且totalBytesExpectedToWrite转移到2X。它总是2倍,我不知道为什么。连接是相同的(通过id),我只调用一次。

以下是我上传图片的代码:

- (void)uploadImage:(UIImage *)image
{ 
// random boundary string
NSString *boundary = @"----8745633765875256----";

NSData *imageData = UIImageJPEGRepresentation(image, 1.0);
NSMutableData *requestData = [[NSMutableData alloc] init];

// append boundary and separate it with new line
[requestData appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

// setting up header files, appending image and separating body with boundary
[requestData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"ad_image\"; filename=\"%@\"\r\n", @"tmp.jpg"] dataUsingEncoding:NSUTF8StringEncoding]];
[requestData appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[requestData appendData:imageData];
[requestData appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];  

// initializing request
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@&user_id=%@&api_key=%@", kUrlImageTempAdd, userID, apiKey]]];
[request setHTTPMethod:@"POST"];

// setting up content-type "form" to multipart/form-data for image upload
[request addValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary] forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:requestData];

//setting up content length
[request setValue:[NSString stringWithFormat:@"%d", [requestData length]] forHTTPHeaderField:@"Content-

// connection init and start
NSURLConnection *connection = [[[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:true] autorelease];
}

这是我的委托方法:

- (void)connection:(NSURLConnection *)connection
didSendBodyData:(NSInteger)bytesWritten
totalBytesWritten:(NSInteger)totalBytesWritten
totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite
{
NSLog(@"connection %@ bytes sent %d/%d (%f%%)", connection, totalBytesWritten, totalBytesExpectedToWrite, ((float)totalBytesWritten / (float)totalBytesExpectedToWrite) * 100.0f);
}

为什么会发生这种情况的任何建议?我在这里失去了理智:)

2 个答案:

答案 0 :(得分:3)

-connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:的文档说

  

在上传期间,totalBytesExpectedToWrite的值可能会发生变化   由于连接丢失或需要重新传输请求   来自服务器的身份验证质询。

NSURLConnection委托方法的文档在从非正式协议转换为正式协议时似乎已基本丢失。您可以检查标题中的注释或让Xcode下载其中一个较旧的docsets并检查那里。)

您可以实现一些其他委托方法来观察可能发生的情况,例如身份验证质询。

答案 1 :(得分:1)

您正在使用的委托方法可以被多次调用,因为它会将数据上传的状态更新报告给服务器...

NSURLConnection对象将以字节数据包的形式将数据传输到服务器,每次发送数据包时都会调用委托方法。

如果您只想知道上传何时结束,则需要使用此委托方法:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection

See more in the official documentation of the NSURLDownloadDelegate delegate