Swathi
Swathi

Reputation: 31

How to get MIME type from an imagepath to send to server

I am new to iOS app development. I am trying to get mimetype of image from the selected image path or image extension, but i don't know how to get it, as well as when i am appending image to multipatformdata, then i am getting an error like "Instance member 'append' cannot be used on type 'MultipartFormData'; did you mean to use a value of this type instead?". If anyone helps me in sending an image to server, it would be great. Thank in advance. I have mentioned my code below and to save filepath and filename i have taken an empty strings.

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info:

        if var imgUrl = info[UIImagePickerController.InfoKey.imageURL] as? URL{
            let imgName = imgUrl.lastPathComponent
            let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first
            let localPath = documentDirectory?.appending(imgName)

            var image = info[UIImagePickerController.InfoKey.originalImage] as! UIImage
            let data = image.pngData()! as NSData
            data.write(toFile: localPath!, atomically: true)
            //let imageData = NSData(contentsOfFile: localPath!)!
            var photoURL = URL.init(fileURLWithPath: localPath!)//NSURL(fileURLWithPath: localPath!)
            print(photoURL)

            filename = photoURL.lastPathComponent
            fileextension = photoURL.pathExtension  // get your file extension

            img.image = image
        }

        let APPDEL = UIApplication.shared.delegate as! AppDelegate
        APPDEL.window?.rootViewController?.dismiss(animated: true, completion: nil)

        }

//Button action to send the image and parameters to server

@IBAction func updatedetails(_ sender: Any) {

        let imageobj = img.image!
        let data = imageobj.pngData()


        let acce:String = UserDefaults.standard.string(forKey: "access")!
        print(acce)

        let headers:HTTPHeaders = ["Authorization":"Bearer \(acce)"]


       // let userData:Data = try! JSONSerialization.data(withJSONObject: postParameters)
        let ImageData = imageobj.jpegData(compressionQuality: 0.5)

        Alamofire.upload(multipartFormData: { (multiFormData) in

            MultipartFormData.append(ImageData!, withName: photoURL, fileName: filename, mimeType: "image/jpeg")
            for (key, value) in Parameters {
                multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: "name")
                multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: "password")
                multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: "password_confirmation")
                multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: "city")
                multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: "state")
                multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: "address")
            }
        }, to: Constants.Userdetailsapi,method:.post,
           headers:headers,
           encodingCompletion: { encodingResult in
            switch encodingResult {
            case .success(let upload, _, _):
                upload.responseJSON { response in
                    debugPrint(response)
                    print(response)
                }
            case .failure(let encodingError):
                print(encodingError)
            }
        })    
}

Upvotes: 0

Views: 1829

Answers (1)

Abhishek R
Abhishek R

Reputation: 269

Create one class with Name of MimeTypes

And Paste below code on that file

import Foundation

internal let DEFAULT_MIME_TYPE = "application/octet-stream"

internal let mimeTypes = [
    "md": "text/markdown",
    "html": "text/html",
    "htm": "text/html",
    "shtml": "text/html",
    "css": "text/css",
    "xml": "text/xml",
    "gif": "image/gif",
    "jpeg": "image/jpeg",
    "jpg": "image/jpeg",
    "js": "application/javascript",
    "atom": "application/atom+xml",
    "rss": "application/rss+xml",
    "mml": "text/mathml",
    "txt": "text/plain",
    "jad": "text/vnd.sun.j2me.app-descriptor",
    "wml": "text/vnd.wap.wml",
    "htc": "text/x-component",
    "png": "image/png",
    "tif": "image/tiff",
    "tiff": "image/tiff",
    "wbmp": "image/vnd.wap.wbmp",
    "ico": "image/x-icon",
    "jng": "image/x-jng",
    "bmp": "image/x-ms-bmp",
    "svg": "image/svg+xml",
    "svgz": "image/svg+xml",
    "webp": "image/webp",
    "woff": "application/font-woff",
    "jar": "application/java-archive",
    "war": "application/java-archive",
    "ear": "application/java-archive",
    "json": "application/json",
    "hqx": "application/mac-binhex40",
    "doc": "application/msword",
    "pdf": "application/pdf",
    "ps": "application/postscript",
    "eps": "application/postscript",
    "ai": "application/postscript",
    "rtf": "application/rtf",
    "m3u8": "application/vnd.apple.mpegurl",
    "xls": "application/vnd.ms-excel",
    "eot": "application/vnd.ms-fontobject",
    "ppt": "application/vnd.ms-powerpoint",
    "wmlc": "application/vnd.wap.wmlc",
    "kml": "application/vnd.google-earth.kml+xml",
    "kmz": "application/vnd.google-earth.kmz",
    "7z": "application/x-7z-compressed",
    "cco": "application/x-cocoa",
    "jardiff": "application/x-java-archive-diff",
    "jnlp": "application/x-java-jnlp-file",
    "run": "application/x-makeself",
    "pl": "application/x-perl",
    "pm": "application/x-perl",
    "prc": "application/x-pilot",
    "pdb": "application/x-pilot",
    "rar": "application/x-rar-compressed",
    "rpm": "application/x-redhat-package-manager",
    "sea": "application/x-sea",
    "swf": "application/x-shockwave-flash",
    "sit": "application/x-stuffit",
    "tcl": "application/x-tcl",
    "tk": "application/x-tcl",
    "der": "application/x-x509-ca-cert",
    "pem": "application/x-x509-ca-cert",
    "crt": "application/x-x509-ca-cert",
    "xpi": "application/x-xpinstall",
    "xhtml": "application/xhtml+xml",
    "xspf": "application/xspf+xml",
    "zip": "application/zip",
    "bin": "application/octet-stream",
    "exe": "application/octet-stream",
    "dll": "application/octet-stream",
    "deb": "application/octet-stream",
    "dmg": "application/octet-stream",
    "iso": "application/octet-stream",
    "img": "application/octet-stream",
    "msi": "application/octet-stream",
    "msp": "application/octet-stream",
    "msm": "application/octet-stream",
    "docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
    "xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
    "pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
    "mid": "audio/midi",
    "midi": "audio/midi",
    "kar": "audio/midi",
    "mp3": "audio/mpeg",
    "ogg": "audio/ogg",
    "m4a": "audio/x-m4a",
    "ra": "audio/x-realaudio",
    "3gpp": "video/3gpp",
    "3gp": "video/3gpp",
    "ts": "video/mp2t",
    "mp4": "video/mp4",
    "mpeg": "video/mpeg",
    "mpg": "video/mpeg",
    "mov": "video/quicktime",
    "webm": "video/webm",
    "flv": "video/x-flv",
    "m4v": "video/x-m4v",
    "mng": "video/x-mng",
    "asx": "video/x-ms-asf",
    "asf": "video/x-ms-asf",
    "wmv": "video/x-ms-wmv",
    "avi": "video/x-msvideo"
]

internal func MimeType(ext: String?) -> String {
    let lowercase_ext: String = ext!.lowercased()
    if ext != nil && mimeTypes.contains(where: { $0.0 == lowercase_ext }) {
        return mimeTypes[lowercase_ext]!
    }
    return DEFAULT_MIME_TYPE
}

extension NSURL {
    public func mimeType() -> String {
        return MimeType(ext: self.pathExtension)
    }
}


extension NSString {
    public func mimeType() -> String {
        return MimeType(ext: self.pathExtension)
    }
}

extension String {
    public func mimeType() -> String {
        return (self as NSString).mimeType()
    }

public func fileName() -> String {
        return NSURL(fileURLWithPath: self).deletingPathExtension?.lastPathComponent ?? ""
    }

   public func fileExtension() -> String {
        return NSURL(fileURLWithPath: self).pathExtension ?? ""
    }
}

Now you can function like this

Alamofire.upload(multipartFormData: { (multiFormData) in

            let fileName = photoURL.lastPathComponent.fileName()
            let extensionName = photoURL.lastPathComponent.fileExtension()

            MultipartFormData.append(ImageData!, withName: photoURL, fileName: filename, mimeType: MimeType(ext: extensionName))
            for (key, value) in Parameters {
                multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: "name")
                multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: "password")
                multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: "password_confirmation")
                multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: "city")
                multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: "state")
                multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: "address")
            }
        }, to: Constants.Userdetailsapi,method:.post,
           headers:headers,
           encodingCompletion: { encodingResult in
            switch encodingResult {
            case .success(let upload, _, _):
                upload.responseJSON { response in
                    debugPrint(response)
                    print(response)
                }
            case .failure(let encodingError):
                print(encodingError)
            }
        })

Upvotes: 1

Related Questions