0

I'm trying to upload file after picking it from gallery/capturing from camera but it gives error domain=nscocoaerrordomain code=260 for the file path, I'm not sure why I got this error and if it's related to really unfound file path, and if it is so what is the path we got then in

//from gallery

       self.selectedImageURL = "\(info[UIImagePickerController.InfoKey.imageURL]!)"

//from Camera

if let originalImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage{
            self.profileImage.image = originalImage

            let imgName = UUID().uuidString
            let documentDirectory = NSTemporaryDirectory()
            let localPath = documentDirectory.appending(imgName)

            let data = originalImage.jpegData(compressionQuality: 0.3)! as NSData
                                  data.write(toFile: localPath, atomically: true)
            let photoURL = URL.init(fileURLWithPath: localPath)


            selectedImageURL = "\(photoURL)"

            print("url is \(selectedImageURL)")


        }

Example for the getting URL: file:///private/var/mobile/Containers/Data/Application/F0A1163F-B8E4-43CA-BE70-3FF0218FB328/tmp/61E3FCBA-1A45-4A53-8877-A9392DACEFD4.jpeg

code of uploading image:

    let parameters = [
      [
        "key": "avatar",
        "src": urlOfImage,
        "type": "file"
      ],
      [
        "key": "user_id",
        "value": UserDefaults.standard.getUserID(),
        "type": "text"
      ]] as [[String : Any]]

    let boundary = "Boundary-\(UUID().uuidString)"
    var body = ""
    var error: Error? = nil
    for param in parameters {
      if param["disabled"] == nil {
        let paramName = param["key"]!
        body += "--\(boundary)\r\n"
        body += "Content-Disposition:form-data; name=\"\(paramName)\""
        let paramType = param["type"] as! String
        if paramType == "text" {
          let paramValue = param["value"] as! String
          body += "\r\n\r\n\(paramValue)\r\n"
        } else {
          let paramSrc = param["src"] as! String

            do{
                let fileData = try NSData(contentsOfFile:paramSrc, options:[]) as Data

                let fileContent = String(data: fileData, encoding: .utf8)!
                body += "; filename=\"\(paramSrc)\"\r\n"
                  + "Content-Type: \"content-type header\"\r\n\r\n\(fileContent)\r\n"
            }catch
                {

                   //it gives error here for this file path doesn't exist
                    print(error)
            }

        }
      }
    }
    body += "--\(boundary)--\r\n";
    let postData = body.data(using: .utf8)

    var request = URLRequest(url: URL(string: my_url)!,timeoutInterval: Double.infinity)
    request.addValue(UserDefaults.standard.getUserToken(), forHTTPHeaderField: "x-access-token")

    request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
    request.addValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")

    request.httpMethod = "POST"
    request.httpBody = postData

    doParsingUpload(request: request)

I hope if anyone can help me to know the problem here, I searched somebody said this is cache path not local path but all codes just gives this way to get path!

Thanks for advance.

Samah Ahmed
  • 419
  • 8
  • 24

2 Answers2

0

Reason: NSFileReadNoSuchFileError = 260, // Read error (no such file)

Solution: Make sure the file exists, run this on your terminal:

[ -e /{path-to-file}/{file-name}.{file-extension} ] && echo "File exists" || echo "File does not exist"

see if it returns File exists

grow4gaurav
  • 3,145
  • 1
  • 11
  • 12
  • ok it gives file doesn't exist but the given URL is read from mobile side for real image in gallery so if the given path for the picked image from gallery is wrong then how we can get the correct path of picked image? – Samah Ahmed May 16 '20 at 22:16
0

I have faced the same issue and I found a solution for it in this SO post.

You need to change this:

let photoURL = URL.init(fileURLWithPath: localPath) 

to this:

let photoUrl = NSURL(fileURLWithPath: localPath!).path!

Also in in your PUT request you need to change this:

let fileContent = String(data: fileData, encoding: .utf8)

I hope it helps you out!

shim
  • 9,289
  • 12
  • 69
  • 108
oussama
  • 1
  • 2