#iphone #image #email #zip #nsdata
#iPhone #изображение #Адрес электронной почты #zip #nsdata
Вопрос:
Я использую библиотеку Objective Zip для сжатия нескольких сделанных мной изображений. Я дошел до того момента (я полагаю), когда я архивирую изображение.
Теперь я хотел бы отправить этот архивированный файл с помощью mailcomposer. Однако мне нужно объявить «объект NSData» в моей почтовой функции.
[picker addAttachmentData:"NSData object" mimeType:@"application/zip" fileName:@"test.zip"];
Вот фрагмент моего кода
-(IBAction)sendMail{
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"test.zip"];
NSArray *data = [[NSArray alloc] initWithObjects:@"first",@"second",@"third",nil];
NSString *docDir3 = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *pngFilePath4 = [NSString stringWithFormat:@"%@/foto2.jpg",paths];
[data writeToFile:pngFilePath4 atomically:YES];
NSData * fotoData = [[NSData alloc] initWithContentsOfFile:pngFilePath4];
NSFileManager *manager = [[NSFileManager alloc] init];
[manager removeItemAtPath:pngFilePath4 error:nil];
ZipFile *readFile = [[ZipFile alloc] initWithFileName:path mode:ZipFileModeCreate];
ZipWriteStream *stream = [readFile writeFileInZipWithName:@"foto2.jpg" compressionLevel:ZipCompressionLevelNone];
[stream writeData:fotoData];
[stream finishedWriting];
MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
picker.mailComposeDelegate=self;
[picker addAttachmentData:"NSData Object" mimeType:@"application/zip" fileName:@"test.zip"];
Class mailclass = (NSClassFromString(@"MFMailComposeViewController"));
if([mailclass canSendMail]){
[self presentModalViewController:picker animated:YES];
}
[readFile close];
[data2 release];
[fotoData release];
}
Я думаю, что мне нужно создать другой объект NSData из объекта ReadFile и поместить его в [picker attachmentData: метод]. Надеюсь, кто-нибудь сможет указать мне правильное направление.
Редактировать
Все еще не могу заставить это работать должным образом. Отправка zip-файла занимает очень много времени (даже через Wi-Fi). Когда я открываю zip-образ, я получаю сообщение об ошибке, в котором говорится, что файл не может быть открыт. Вот мой код:
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"test.zip"];
NSArray *data = [[NSArray alloc] initWithObjects:@"first",@"second", nil];
NSString *docDir3 = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *pngFilePath3 = [NSString stringWithFormat:@"%@/foto2.jpeg",docDir3];
NSData * imageData2 = [[[NSData alloc] initWithContentsOfFile:pngFilePath3] autorelease];
[data writeToFile:pngFilePath3 atomically:YES];
ZipFile *readFile = [[ZipFile alloc] initWithFileName:path mode:ZipFileModeCreate];
ZipWriteStream *stream = [readFile writeFileInZipWithName:@"foto2.jpeg" compressionLevel:ZipCompressionLevelNone];
[stream writeData:imageData2];
[stream finishedWriting];
MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
picker.mailComposeDelegate=self;
[picker addAttachmentData:[NSData dataWithContentsOfFile:path] mimeType:@"application/zip" fileName:@"test.zip"];
Class mailclass = (NSClassFromString(@"MFMailComposeViewController"));
if([mailclass canSendMail]){
[self presentModalViewController:picker animated:YES];
}
[data release];
[readFile close];
Заранее спасибо за помощь!
Ответ №1:
ZipWriteStream
Выполняется запись в path
, и получение данных из пути к файлу выполняется с помощью [NSData dataWithContentsOfFile:path]
.
[picker addAttachmentData:[NSData dataWithContentsOfFile:path]
mimeType:@"application/zip"
fileName:@"test.zip"];
Objective-Zip выдает исключения при сбое записи, поэтому обязательно добавьте try / catch вокруг операции записи и убедитесь, что ваши данные не равны нулю.
Комментарии:
1. Спасибо, однако я все еще не могу заставить его работать. Я отредактирую свой ответ выше.