【问题标题】:Create Zip file from an array of data (coreData Images) and share via the .zip file via Email从一组数据(coreData 图像)创建 Zip 文件并通过电子邮件通过 .zip 文件共享
【发布时间】:2019-11-25 16:35:23
【问题描述】:

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

let imageData: [Data]... 

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

我有几个问题:

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

之后,我有一个 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)
    }
}

我做错了什么:(

【问题讨论】:

  • 与您的问题无关,但您应该开始捕捉错误而不是忽略它们。
  • 我发现了错误,但我为这篇文章发表了评论。
  • 您不应一次在内存中加载多个图像。尝试将它们保存到非临时的本地目录中
  • 我应该创建一个只有一个图像文件的 zip 文件吗?
  • 我不明白你的意思。不要将图像数据附加到数组中,而是将它们保存到文件夹中。他们可以将所有这些文件 url 传递给您的 create zip 方法。您还可以压缩保存图像的整个文件夹。

标签: swift core-data uiimage nsdata


【解决方案1】:

经过大量调试,终于找到了问题所在。 首先丹尼尔斯的回答也是正确的。

但主要问题是我的sendEmailWith 函数,"application/zip" 不起作用!

所以我在目录 URL 中添加了UIActivityViewController,它就可以工作了。

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

【讨论】:

    【解决方案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
        }
    }
    

    将所有图片保存到临时目录:

    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)
            }
        }
    }
    

    在您发送文件后,您可能希望删除临时目录,这样您的应用程序大小就不会开始增长。

    【讨论】:

      【解决方案3】:

      移动

      self.createZipFile(urlArray: urlArray)
      

      forEach 循环之后。

      【讨论】:

      • 这只是一个复制和粘贴错误,但它并没有解决我的问题。谢谢。
      • 它到底在哪里崩溃了?你试过设置断点吗?
      • 什么都没有刹车,只是创建的 Zip 文件出错了。
      猜你喜欢
      • 2012-05-09
      • 2018-07-04
      • 1970-01-01
      • 1970-01-01
      • 2021-03-23
      • 1970-01-01
      • 2016-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多