1

I'm new in Swift,and have some problem with sending an image to api, from MacOS app. I try with lot of codes, this one is(as I think) most correct, but it doesn't work:

func mimeTypeForPath(path: String) -> String {
    let url = NSURL(fileURLWithPath: path)
    let pathExtension = url.pathExtension

    if let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension! as NSString, nil)?.takeRetainedValue() {
        if let mimetype = UTTypeCopyPreferredTagWithClass(uti, kUTTagClassMIMEType)?.takeRetainedValue() {
            return mimetype as String
        }
    }
    return "application/octet-stream";
}

func sendScreenshoot(url: String){
    let img = NSImage(byReferencingFile: home.path)
    guard let uploadData = try? img?.tiffRepresentation else {
        return
    }
    let mimetype = mimeTypeForPath(path: home.path)
    print(mimetype)
    let boundary = "Boundary-\(UUID().uuidString)"
    print(boundary)
    var request = URLRequest(url: URL(string: url)!)
    request.httpMethod = "POST"
    request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
    var body = Data()
    body.appendString("--\(boundary)\r\n")
    body.appendString("Content-Disposition: form-data; name=\"screenshot\"; filename=\"screenshot.png\"\r\n")
    body.appendString("Content-Type: \(mimetype)\r\n\r\n")
    body.append(uploadData!)
    body.appendString("\r\n")
    body.appendString("--\(boundary)--\r\n")
    request.httpBody = body
    URLSession.shared.dataTask(with: request, completionHandler: { (data, response, error) -> Void in
        print(error)
    }).resume()

}

What is the best way to send files(images) with swift 4 Mac OS(without Alamofire)?

Dávid Pásztor
  • 51,403
  • 9
  • 85
  • 116
AUS
  • 11
  • 4
  • Possible duplicate of [Failing to Upload Picture with multipart/form-data to a Server](https://stackoverflow.com/questions/49003256/failing-to-upload-picture-with-multipart-form-data-to-a-server) – El Tomato Jun 06 '18 at 09:48

2 Answers2

0

Try below code

func myImageUploadReques(){
    if let data:Data = UIImageJPEGRepresentation(img_Selected.image!, 0.5) {
        let base64String = data.base64EncodedString(options: Data.Base64EncodingOptions(rawValue: 0))
        print(base64String)
        let strBase1 = base64String.replacingOccurrences(of: "+", with: "%2B", options: NSString.CompareOptions.literal, range: nil)
        let str =  strBase1.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
        var params: [String:String] = [:]
        params["action"] = "upload_file"
        params["document_type"] = "image"
        params["file"] = str
        myRequest.SendRequestUrl(del: self as MyURLRequestDelegate, params: params , type: "upload_file")
        LoadingOverlay.shared.showLoaderView(view: self.view)
    }
}
Yogesh Tandel
  • 1,738
  • 1
  • 19
  • 25
  • Thank's,but it seems that its for iOS,i need for Mac OS. I don't have that functions. – AUS Jun 06 '18 at 10:04
0

I found the working solution.

func sendScreenshoot(url: String){

    let img = try? Data(contentsOf: home)
    let mimetype = mimeTypeForPath(path: home.path)
    var request = URLRequest(url: URL(string: url)!)
    request.httpMethod = "POST"
    let boundary = "Boundary-\(NSUUID().uuidString)"
    request.setValue("multipart/form-data; boundary=\(boundary)",
        forHTTPHeaderField: "Content-Type")
    let body = NSMutableData()
    let fname = "screenshoot.png"
    body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
    body.append("Content-Disposition:form-data;name=\"photo\"\r\n\r\n".data(using: String.Encoding.utf8)!)
    body.append("Incoming\r\n".data(using: String.Encoding.utf8)!)
    body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
    body.append("Content-Disposition:form-data; name=\"file\";filename=\"\(fname)\"\r\n".data(using: String.Encoding.utf8)!)
    body.append("Content-Type: \(mimetype)\r\n\r\n".data(using:
        String.Encoding.utf8)!)
    body.append(img!)
    body.append("\r\n".data(using: String.Encoding.utf8)!)
    body.append("--\(boundary)--\r\n".data(using:
        String.Encoding.utf8)!)

    request.httpBody = body as Data

    let session = URLSession.shared

    let task = session.dataTask(with: request as URLRequest) {
        (
        data, response, error) in
    }
    task.resume()
}
AUS
  • 11
  • 4