从数据数组(coreData图片)创建Zip文件,然后通过电子邮件通过.zip文件共享

时间:2019-07-16 21:35:17

标签: objective-c swift core-data uiimage nsdata

我的CoreData中有(n)个数据(UIImage JPEG)。

let imageData: [Data]... 

我已经有了这两个框架/ Pod:ZipZIPFoundation

我对此有几个疑问:

  1. 我需要为每个imageData创建一个临时URL吗?
  2. 如果是,我必须在调用data.write(to:tempURL)之前或之后向每个临时URL添加tempURL.appendingPathExtension(“ jpg”)吗?

在那之后,我有了一个URL数组,所以我只需要创建一个Zip文件并共享它。但这不起作用,我在Mac上看到一个.zip-.cpgz循环。

 private func createURLsFrom(imageData: [ImageData]?) {
    var urlArray = [URL]()
    imageData?.forEach { imData in
        if let data = imData.imageData,
        let tempURL = NSURL.fileURL(withPathComponents: [NSTemporaryDirectory(), NSUUID().uuidString])?.appendingPathExtension("jpg") {

            do {
                try data.write(to: tempURL)
                urlArray.append(tempURL)

            } catch {...}
        }
    }
    self.createZipFile(urlArray: urlArray)
}



private func createZipFile(urlArray: [URL]) {
    if let zipURL = try? Zip.quickZipFiles(urlArray, fileName: "ZIP_Test1") {
        self.sendEmailWith(dataURL: zipURL)
    } else {...}
}


private func sendEmailWith(dataURL: URL) {
    if MFMailComposeViewController.canSendMail() {

        let mailComposer = MFMailComposeViewController()
        mailComposer.mailComposeDelegate = self

        mailComposer.setSubject("setSubject")
        mailComposer.setMessageBody("setMessageBody", isHTML: false)
        mailComposer.addAttachmentData(dataURL.dataRepresentation, mimeType: "application/zip", fileName: ("ZIP_Test1.zip"))

        self.present(mailComposer, animated: true, completion: nil)
    }
}

我在做什么错了:(

3 个答案:

答案 0 :(得分:2)

这有点冗长,并且-免责声明 –未测试。让我知道它是否有效,或者您有任何疑问。

为所有文件创建一个临时目录:

func createTempDirectory() -> URL? {
    if let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
        let dir = documentDirectory.appendingPathComponent("temp-dir-\(UUID().uuidString)")
        do {
            try FileManager.default.createDirectory(atPath: dir.path, withIntermediateDirectories: true, attributes: nil)
        } catch {
            print(error.localizedDescription)
        }
        return dir
    } else {
        return nil
    }
}

将所有图像保存到temp目录:

func saveImages(data: [Data]) -> URL? {
    guard let directory = createTempDirectory() else { return nil }

    do {
        for (i, imageData) in data.enumerated() {
            try imageData.write(to: directory.appendingPathComponent("image\(i).jpg"))
        }
        return directory
    } catch {
        return nil
    }
}

获取压缩文件的URL。如果在执行过程中发生错误,这是可选的。另外,在后台线程上完成,因为这可能会花费一些时间,并且您不想阻塞主线程。

func zipImages(data: [Data], completion: @escaping ((URL?) -> ())) {
    DispatchQueue.main.async {
        guard let directory = saveImages(data: data) else {
            completion(nil)
            return
        }

        do {
            let zipFilePath = try Zip.quickZipFiles([directory], fileName: "archive-\(UUID().uuidString)")
            completion(zipFilePath)
        } catch {
            completion(nil)
        }
    }
}

发送文件后,您可能需要删除temp目录,以便您的应用程序大小不会开始增长。

答案 1 :(得分:0)

移动

self.createZipFile(urlArray: urlArray)

forEach循环之后。

答案 2 :(得分:0)

最后经过大量调试,我找到了问题。 首先, Daniels 答案也是正确的。

但是主要问题是我的sendEmailWith函数,“ application / zip” 无法正常工作!

因此,我在目录UIActivityViewController中添加了目录URL,它可以正常工作。

现在我可以通过Mail和Airdrop共享我的Zip文件!