2

サーバーに画像をアップロードしています。画像をアップロードしているときに、アップロードの進行状況バーをユーザーに表示しようとしています。しかし、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);
}

なぜこれが起こっているのか、何か提案はありますか?私はここで私の心を失っています:)

4

2 に答える 2

3

のドキュメントは-connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:言う

totalBytesExpectedToWrite の値は、接続の切断またはサーバーからの認証チャレンジのためにリクエストを再送信する必要がある場合、アップロード中に変更されることがあります。

(デリゲート メソッドのドキュメントはNSURLConnection、非公式から正式なプロトコルに移行したときにほとんど失われたようです。ヘッダーのコメントを確認するか、Xcode で古いドキュメントセットの 1 つをダウンロードして確認してください。)

認証チャレンジなど、他のデリゲート メソッドのいくつかを実装して、何が起こっているのかを観察できます。

于 2012-05-16T12:29:09.910 に答える
1

使用しているデリゲート メソッドは、サーバーへのデータ アップロードのステータス更新を報告するため、何度も呼び出すことができます...

NSURLConnection オブジェクトはデータをバイト パケットでサーバーに転送し、パケットが送信されるたびにデリゲート メソッドを呼び出します。

アップロードがいつ終了したかだけを知りたい場合は、次のデリゲート メソッドを使用する必要があります。

- (void)connectionDidFinishLoading:(NSURLConnection *)connection

NSURLDownloadDelegateデリゲートの公式ドキュメントで詳細を参照してください

于 2012-05-16T10:57:48.790 に答える