Как я могу преобразовать мой Zip-файл в NSData, чтобы отправить мой Zip-файл по электронной почте в виде вложения

#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. Спасибо, однако я все еще не могу заставить его работать. Я отредактирую свой ответ выше.