How are you converting back the base64 data to an image? Some implementations limit the maximum line length they will accept. Try inserting a line break every so many characters.
Aleph
2010-10-05 02:37:34
How are you converting back the base64 data to an image? Some implementations limit the maximum line length they will accept. Try inserting a line break every so many characters.
I wish I could give credit to GregInYEG, because his original point about padding was the underlying issue. With base64, each chunk has to be a multiple of 3. So this resolved the issue:
chunkSize = 3600
Once I had that, the corruption went away. But then I ran into memory leak issues, so I added the autorelease pool apprach taken from this post: http://www.cocoadev.com/index.pl?ReadAFilePieceByPiece
Final code:
// Read data in chunks from the original file [originalFile seekToEndOfFile]; NSUInteger fileLength = [originalFile offsetInFile]; [originalFile seekToFileOffset:0]; // For base64, each chunk *MUST* be a multiple of 3 NSUInteger chunkSize = 24000; NSUInteger offset = 0; NSAutoreleasePool *chunkPool = [[NSAutoreleasePool alloc] init]; while(offset "]; serializedString = [serializedString substringFromIndex:r.location+7]; r = [serializedString rangeOfString:@""]; serializedString = [serializedString substringToIndex:r.location-1]; // Write the base64 encoded chunk to our output file NSData *base64EncodedChunk = [serializedString dataUsingEncoding:NSASCIIStringEncoding]; [encodedFile truncateFileAtOffset:[encodedFile seekToEndOfFile]]; [encodedFile writeData:base64EncodedChunk]; // Cleanup base64EncodedChunk = nil; serializedChunk = nil; serializedString = nil; chunk = nil; // Update the progress bar [self updateProgress:[NSNumber numberWithInt:offset] total:[NSNumber numberWithInt:fileLength]]; // Drain and recreate the pool [chunkPool release]; chunkPool = [[NSAutoreleasePool alloc] init]; } [chunkPool release];