ios image swift writetofile

ios - ¿Cómo usar writeToFile para guardar la imagen en el directorio de documentos?



swift (6)

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

No recibo ningún error, pero la imagen no se guarda en el documento.


El problema es que está verificando si la carpeta no existe, pero debe verificar si el archivo existe. Otro problema en su código es que necesita usar url.path en lugar de url.absoluteString. También está guardando una imagen JPEG usando una extensión de archivo "png". Deberías usar "jpg".

editar / actualizar:

Swift 4.2 o posterior

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


En Swift 4.2 y 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) } } }


Esta es mi respuesta para Swift 3 , combinando las 2 respuestas anteriores:

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


Ponga la imagen en un objeto NSData; escribir en un archivo con esta clase es muy fácil y hará que el tamaño del archivo sea más pequeño.

Por cierto, recomiendo NSPurgeableData. Después de guardar la imagen, puede marcar el objeto como purgable, lo que mantendrá el consumo de memoria. Eso puede ser un problema con su aplicación, pero podría ser con otra que está desplazando.


Un método de extensión en 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) } } } }


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