I am trying to save and load images to and from the file directory, however my writeImageToPath
function prints the following error to the console and says the file does not exist.
Console
Write image to directory
File exists Write image
Error Write image to directory File does NOT exist -- file:///Users/user/Library/Developer/CoreSimulator/Devices/70EAC77D-9F3C-4AFC-8CCA-A7B9B895BDE6/data/Containers/Data/Application/DDAF2EBD-5DDA-4EA6-95D3-6785B74A0B09/Documents/upload/http://i.annihil.us/u/prod/marvel/i/mg/a/f0/5202887448860 -- is available for use Write image Error Writing Image: Error Domain=NSCocoaErrorDomain Code=4 "The file “5202887448860” doesn’t exist." UserInfo={NSFilePath=/Users/user/Library/Developer/CoreSimulator/Devices/70EAC77D-9F3C-4AFC-8CCA-A7B9B895BDE6/data/Containers/Data/Application/DDAF2EBD-5DDA-4EA6-95D3-6785B74A0B09/Documents/upload/http://i.annihil.us/u/prod/marvel/i/mg/a/f0/5202887448860, NSUnderlyingError=0x600003b04ab0 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}}
Here's my code, I am not sure where I am going wrong
// The images are loaded from the web and displayed in the cell.imageView.image
if let thumbnail = product["thumbnail"] as? [String: Any],
let path = thumbnail["path"] as? String,
let fileExtension = thumbnail["extension"] as? String {
//Save image to directory
if image != nil {
writeImageToPath(path, image: image!)
}
}
// Write image to directory
func writeImageToPath(_ path: String, image: UIImage) {
print("Write image to directory")
let uploadURL = URL.createFolder(folderName: "upload")!.appendingPathComponent(path)
if !FileManager.default.fileExists(atPath: uploadURL.path) {
print("File does NOT exist -- \(uploadURL) -- is available for use")
let uploadURL = URL.createFolder(folderName: "upload")!.appendingPathComponent(path)
if let data = UIImageJPEGRepresentation(image, 0.9) {
do {
print("Write image")
try data.write(to: uploadURL)
}
catch {
print("Error Writing Image: \(error)")
}
} else {
print("Image is nil")
}
} else {
print("This file exists -- something is already placed at this location")
}
}
// load image from directory
func loadImageFromPath(_ path: String) -> UIImage? {
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
let folderURL = documentsURL.appendingPathComponent("upload")
let fileURL = folderURL.appendingPathComponent(path)
if FileManager.default.fileExists(atPath: fileURL.path) {
//Get Image And upload in server
print("fileURL.path \(fileURL.path)")
do{
let data = try Data.init(contentsOf: fileURL)
let image = UIImage(data: data)
return image
}catch{
print("error getting image")
}
} else {
print("No image in directory")
}
return nil
}
extension URL {
static func createFolder(folderName: String) -> URL? {
let fileManager = FileManager.default
// Get document directory for device, this should succeed
if let documentDirectory = fileManager.urls(for: .documentDirectory,
in: .userDomainMask).first {
// Construct a URL with desired folder name
let folderURL = documentDirectory.appendingPathComponent(folderName)
// If folder URL does not exist, create it
if !fileManager.fileExists(atPath: folderURL.path) {
do {
// Attempt to create folder
try fileManager.createDirectory(atPath: folderURL.path,
withIntermediateDirectories: true,
attributes: nil)
} catch {
// Creation failed. Print error & return nil
print(error.localizedDescription)
return nil
}
}
// Folder either exists, or was created. Return URL
return folderURL
}
// Will only be called if document directory not found
return nil
}
}
How can I correctly save and load images from the directory ?
writeToImagePath
do { print("Worked" try data!.write(to: fileURL) } catch { print(error) }
– impression7vxcatch
block, are you sure thatwrite(to:)
doesn't throw an exception? – mag_zbcwriteToImagePath
? When you test writing an image to a file path, does it print "Worked" or does it print the error? – impression7vx