Descrizione: Ho bisogno di inviare una stringa codificata 64 di base in un parametro HTTP POST che rappresenta un file da caricare.Large Base64 upload in iOS
metodo attuale: sto usando un ASIFormDataRequest e la codifica il mio file in una stringa base64 in questo modo:
NSData *data = [[NSFileManager defaultManager] contentsAtPath:@"my path here"];
NSString *base64Data = [data encodeBase64ForData];
Tuttavia durante il caricamento di file di grandi dimensioni l'App esaurisce la memoria e muore di una morte orribile!
Soluzione proposta: Qualcuno ora come andrei circa, ad esempio, la lettura del file dal disco, la conversione in stringhe base64 a pezzi e allegando la stringa base64 convertita a un parametro nella richiesta HTTP?
Effettivamente qualsiasi modo che eviti di leggere l'intero file in memoria.
Qualsiasi input sarebbe molto apprezzato!
mio http codice di richiesta per intero:
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:)];
Non ho mai visto un convertitore Base64 chunking, ma non dovrebbe essere troppo difficile prendere un'implementazione open source e trasformarlo in uno chunking. Base64 non è * quello * complicato. –
Hai anche il controllo del web server? Significato puoi modificare il codice anche lì? E quando dici file di grandi dimensioni? Quanto largo? 100 MB? 500 MB? 1 GB? –
Al momento i caricamenti sono limitati a 100 MB, anche se questo potrebbe aumentare in futuro. Idealmente la soluzione dovrebbe funzionare indipendentemente dalla dimensione del caricamento, poiché sono sicuro che questo codice verrà utilizzato in molti altri progetti. Sto dando un'occhiata ai flussi al momento ... –