Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to use writeToFile to save image in document directory?

// directoryPath is a URL from another VC
@IBAction func saveButtonTapped(sender: AnyObject) {
            let directoryPath           =  NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] as NSURL
            let urlString : NSURL       = directoryPath.URLByAppendingPathComponent("Image1.png")
            print("Image path : \(urlString)")
            if !NSFileManager.defaultManager().fileExistsAtPath(directoryPath.absoluteString) {
                UIImageJPEGRepresentation(self.image, 1.0)!.writeToFile(urlString.absoluteString, atomically: true)
                displayImageAdded.text  = "Image Added Successfully"
            } else {
                displayImageAdded.text  = "Image Not Added"
                print("image \(image))")
            }
        }

I am not getting any error but the Image is not getting saved in the document.

like image 350
Nishad Arora Avatar asked Sep 29 '15 06:09

Nishad Arora


People also ask

How do I save a file in UIImage?

If you've generated an image using Core Graphics, or perhaps rendered part of your layout, you might want to save that out as either a PNG or a JPEG. Both are easy thanks to two methods: pngData() and jpegData() , both of which convert a UIImage into a Data instance you can write out.

How do I create a directory in Swift?

Swift – Create Directory at Specific Path To create a Directory at specific path in Swift, call createDirectory() function on the file manager object. The following code snippet creates Directory at path “/ab/cd/”. withIntermediateDirectories: true creates intermediate directories if not present.


8 Answers

The problem there is that you are checking if the folder not exists but you should check if the file exists. Another issue in your code is that you need to use url.path instead of url.absoluteString. You are also saving a jpeg image using a "png" file extension. You should use "jpg".

edit/update:

Swift 4.2 or later

do {     // get the documents directory url     let documentsDirectory = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)     print("documentsDirectory:", documentsDirectory.path)     // choose a name for your image     let fileName = "image.jpg"     // create the destination file url to save your image     let fileURL = documentsDirectory.appendingPathComponent(fileName)     // get your UIImage jpeg data representation and check if the destination file url already exists     if let data = image.jpegData(compressionQuality:  1),         !FileManager.default.fileExists(atPath: fileURL.path) {         // writes the image data to disk         try data.write(to: fileURL)         print("file saved")     } } catch {     print("error:", error) } 

To write the image at the destination regardless if the image already exists or not you can use .atomic options, if you would like to avoid overwriting an existing image you can use withoutOverwriting instead:

try data.write(to: fileURL, options: [.atomic]) 
like image 128
Leo Dabus Avatar answered Nov 03 '22 17:11

Leo Dabus


This is my answer for Swift 3, combining the 2 answers above:

let documentsDirectoryURL = try! FileManager().url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true) // create a name for your image let fileURL = documentsDirectoryURL.appendingPathComponent("Savedframe.png")   if !FileManager.default.fileExists(atPath: fileURL.path) {     do {         try UIImagePNGRepresentation(imageView.image!)!.write(to: fileURL)             print("Image Added Successfully")         } catch {             print(error)         }     } else {         print("Image Not Added") } 
like image 44
Roxana Avatar answered Nov 03 '22 15:11

Roxana


An extension method in swift 4.2

import Foundation
import UIKit

extension UIImage {

    func saveToDocuments(filename:String) {
        let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
        let fileURL = documentsDirectory.appendingPathComponent(filename)
        if let data = self.jpegData(compressionQuality: 1.0) {
            do {
                try data.write(to: fileURL)
            } catch {
                print("error saving file to documents:", error)
            }
        }
    }

}
like image 28
daviddna Avatar answered Nov 03 '22 15:11

daviddna


@IBAction func saveButtonTapped(sender: AnyObject) {
let directoryPath           =  try! NSFileManager().URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: true)    
let urlString : NSURL       = directoryPath.URLByAppendingPathComponent("Image1.png")
    print("Image path : \(urlString)")
    if !NSFileManager.defaultManager().fileExistsAtPath(urlString.path!) {
        UIImageJPEGRepresentation(self.image, 1.0)!.writeToFile(urlString.path! , atomically: true)
        displayImageAdded.text  = "Image Added Successfully"
    } else {
        displayImageAdded.text  = "Image Not Added"
        print("image \(image))")
    }
}
like image 33
Nishad Arora Avatar answered Nov 03 '22 15:11

Nishad Arora


Put the image in an NSData object; writing to a file with this class is a breeze, and it'll make the file size smaller.

By the way, I recommend NSPurgeableData. After saving the image, you can mark the object as purgeable, which will keep memory consumption. That may be a problem with your app, but might be with another you're crowding out.

like image 29
James Bush Avatar answered Nov 03 '22 16:11

James Bush


In Swift 4.2 and Xcode 10.1

func saveImageInDocsDir() {

    let image: UIImage? = yourImage//Here set your image
    if !(image == nil) {
        // get the documents directory url
        let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
        let documentsDirectory = paths[0] // Get documents folder
        let dataPath = URL(fileURLWithPath: documentsDirectory).appendingPathComponent("ImagesFolder").absoluteString //Set folder name
        print(dataPath)
        //Check is folder available or not, if not create 
        if !FileManager.default.fileExists(atPath: dataPath) {
            try? FileManager.default.createDirectory(atPath: dataPath, withIntermediateDirectories: true, attributes: nil) //Create folder if not
        }

        // create the destination file url to save your image
        let fileURL = URL(fileURLWithPath:dataPath).appendingPathComponent("imageName.jpg")//Your image name
        print(fileURL)
        // get your UIImage jpeg data representation
        let data = UIImageJPEGRepresentation(image!, 1.0)//Set image quality here
        do {
            // writes the image data to disk
            try data?.write(to: fileURL, options: .atomic)
        } catch {
            print("error:", error)
        }
    }
}
like image 37
Naresh Avatar answered Nov 03 '22 16:11

Naresh


Although the answers are correct, I want to share utility functions for this purpose. You can use the following 2 methods to save and Image in Documents Directory and then load an image from Documents Directory. Here you can find the Detailed Article.

public static func saveImageInDocumentDirectory(image: UIImage, fileName: String) -> URL? {

        let documentsUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!;
        let fileURL = documentsUrl.appendingPathComponent(fileName)
        if let imageData = UIImagePNGRepresentation(image) {
            try? imageData.write(to: fileURL, options: .atomic)
            return fileURL
        }
        return nil
    }

public static func loadImageFromDocumentDirectory(fileName: String) -> UIImage? {

        let documentsUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!;
        let fileURL = documentsUrl.appendingPathComponent(fileName)
        do {
            let imageData = try Data(contentsOf: fileURL)
            return UIImage(data: imageData)
        } catch {}
        return nil
    }
like image 22
Asad Ali Choudhry Avatar answered Nov 03 '22 15:11

Asad Ali Choudhry


Answer for Swift 5.x

func saveImageToDocumentsDirectory() {
        let directoryPath =  try! FileManager().url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
        let urlString : NSURL = directoryPath.appendingPathComponent("Image1.png") as NSURL
            print("Image path : \(urlString)")
        if !FileManager.default.fileExists(atPath: urlString.path!) {
            do {
                try self.image.jpegData(compressionQuality: 1.0)!.write(to: urlString as URL)
                print ("Image Added Successfully")
            } catch {
                print ("Image Not added")
            }
        }
    }

Note : image = your declared image.

like image 41
Ioannis Avatar answered Nov 03 '22 15:11

Ioannis