説明: アップロードするファイルを表す HTTP POST パラメータで、base 64 でエンコードされた文字列を送信する必要があります。
現在の方法: ASIFormDataRequest を使用して、ファイルを次のように base64 文字列にエンコードしています。
NSData *data = [[NSFileManager defaultManager] contentsAtPath:@"my path here"];
NSString *base64Data = [data encodeBase64ForData];
ただし、大きなファイルをアップロードすると、アプリがメモリ不足になり、恐ろしい死に至ります。
提案された解決策:ディスクからファイルを読み取り、それをbase64文字列にチャンクで変換し、変換されたbase64文字列をHTTPリクエストのパラメータに添付する方法を教えてください。
ファイル全体をメモリに読み込まないようにする効果的な方法。
どんな入力でも大歓迎です!
完全な私のhttpリクエストコード:
NSURL *url = [NSURL URLWithString:requestProgressURLString];
NSData *data = [[NSFileManager defaultManager] contentsAtPath:evidence.uri];
NSString *base64Data = [data encodeBase64ForData];
NSURL *fileURL = [[NSURL alloc] initWithString:evidence.uri];
request = [ASIFormDataRequest requestWithURL:url];
request.shouldAttemptPersistentConnection = false;
[request setShowAccurateProgress:YES];
[request setPostValue:accessToken forKey:@"AccessToken"];
[request setPostValue:[[fileURL path] lastPathComponent] forKey:@"Filename"];
[request setPostValue:evidence.name forKey:@"Title"];
[request setPostValue:base64Data forKey:@"FileData"]; //wants string value (base64 encoded)
[request addRequestHeader:@"Content-Type" value:@"application/x-www-form-urlencoded"];
[request setTimeOutSeconds:60];
[request setUploadProgressDelegate:self];
[request setDownloadProgressDelegate:self];
[request setDelegate:self];
[request setDidFinishSelector:@selector(requestDone:)];
[request setDidFailSelector:@selector(requestWentWrong:)];