web-dev-qa-db-fra.com

comment utiliser writeToFile pour enregistrer une image dans le répertoire du document?

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

Je ne reçois aucune erreur, mais l'image n'est pas enregistrée dans le document.

12
Nishad Arora

Le problème est que vous vérifiez si le dossier n'existe pas, mais vous devez vérifier si le fichier existe. Un autre problème dans votre code est que vous devez utiliser url.path au lieu de url.absoluteString. Vous sauvegardez également une image jpeg en utilisant une extension de fichier "png". Vous devriez utiliser "jpg".

éditer/mettre à jour:

Swift 4

// get the documents directory url
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(fileName)
// get your UIImage jpeg data representation and check if the destination file url already exists
if let data = UIImageJPEGRepresentation(image, 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)
    }
}
21
Leo Dabus

Voici ma réponse pour Swift 3 , en combinant les 2 réponses ci-dessus: 

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")
}
24
Roxana

Une méthode d'extension dans 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)
            }
        }
    }

}
1
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))")
    }
}
1
Nishad Arora

Placez l'image dans un objet NSData; écrire dans un fichier avec cette classe est un jeu d'enfant, et cela réduira la taille du fichier.

En passant, je recommande NSPurgeableData. Après avoir sauvegardé l'image, vous pouvez marquer l'objet comme purgeable, ce qui permettra de conserver la consommation de mémoire. Cela peut être un problème avec votre application, mais peut-être avec un autre que vous évincez.

1
James Bush

Dans Swift 4.2 et 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)
        }
    }
}
0
iOS