在文档目录中保存图像时出错

Posted

技术标签:

【中文标题】在文档目录中保存图像时出错【英文标题】:Error in saving image in documents directory 【发布时间】:2019-03-12 06:54:27 【问题描述】:

我从我的服务器获取一个图像 URL,我想将它保存在文档目录中。 但是在我的以下代码中,我遇到了一个错误。

这是我的文件 URL 路径 - file:///var/mobile/Containers/Data/Application/7AA1BEDE-DA10-4BD6-8115-06C9DCA53BF2/Documents/https://www.cocubes.com/images/getimage.aspx%3Ft=l&id=602

文件 URL.path = /var/mobile/Containers/Data/Application/7AA1BEDE-DA10-4BD6-8115-06C9DCA53BF2/Documents/https://www.cocubes.com/images/getimage.aspx?t=l&id=602

“?”正在转换为 %3F,因此我猜(不确定)我无法前往所需的路径。 这个问题怎么解决??

static func saveImageInDocsDir(image: UIImage,urlString: NSString) 
    let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
    // choose a name for your image
    //let fileName = "image.jpg"
    // create the destination file url to save your image
    let fileURL = documentsDirectory.appendingPathComponent(urlString as String)
    print(fileURL)
    print(fileURL.path)
    // get your UIImage jpeg data representation and check if the destination file url already exists
    if let data = image.jpegData(compressionQuality: 1.0),
        !FileManager.default.fileExists(atPath: fileURL.path) 
        do 
            // writes the image data to disk
            try data.write(to: fileURL)
            print("file saved")
         catch 
            print("error saving file:", error)
        
    

【问题讨论】:

你检查过finder..中的文件路径吗?图片是否存在 问题在于 urlString 包含 / 文件管理器试图将图像的数据保存在不存在的文件夹中。您可以通过将出现的 / 字符替换为 _ 来解决此问题。 【参考方案1】:

请在下面添加这一行: 让 filePath = filesDirectory.appendingPathComponent(fileURL)

 static func saveImageInDocsDir(image: UIImage,urlString: NSString) 
                let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
                // choose a name for your image
                //let fileName = "image.jpg"
                // create the destination file url to save your image
                let fileURL = documentsDirectory.appendingPathComponent(urlString as String)
                print(fileURL)
                print(fileURL.path)
                // get your UIImage jpeg data representation and check if the destination file url already exists
                let filePath = documentsDirectory.appendingPathComponent(fileURL)
                if let data = image.jpegData(compressionQuality: 1.0),
                    !FileManager.default.fileExists(atPath: filePath.path) 
                    do 
                    // writes the image data to disk
                    try data.write(to: fileURL)
                    print("file saved")
                     catch 
                    print("error saving file:", error)
                
        
    

【讨论】:

【参考方案2】:

问题在于 urlString 包含 /,FileManager 试图将图像的数据保存在不存在的文件夹中。您可以通过将出现的 / 字符替换为 _ 来解决此问题。

let fileURL = documentsDirectory.appendingPathComponent((urlString as String).replacingOccurrences(of: "/", with: "_"))

另一种解决方案是先创建一个文件夹。

static func saveImageInDocsDir(image: UIImage, urlString: NSString) 
    let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
    // choose a name for your image
    //let fileName = "image.jpg"
    // create the destination file url to save your image
    let fileURL = documentsDirectory.appendingPathComponent(urlString as String)
    print(fileURL)
    print(fileURL.path)
    // get your UIImage jpeg data representation and check if the destination file url already exists
    if let data = image.jpegData(compressionQuality: 1.0),
        !FileManager.default.fileExists(atPath: fileURL.path) 
        do 
            // First create a directory
            try FileManager.default.createDirectory(at: fileURL.deletingLastPathComponent(), withIntermediateDirectories: true, attributes: nil)
            // writes the image data to disk
            try data.write(to: fileURL)
            print("file saved")
         catch 
            print("error saving file:", error)
        
    

【讨论】:

以上是关于在文档目录中保存图像时出错的主要内容,如果未能解决你的问题,请参考以下文章

ios Photo Framework:保存图像时出错

路径名太长,尝试在 Python 中使用 OpenCV 或 PIL.Image 保存图像时出错

在 MFC 中保存位图时出错

使用“保存”保存目录时出错

使用grabToImage将QML项目作为图像保存到文件时出错

“内存不足,现在保存文件。”打开word 2003文档时出错