Required request part 'file' is not present error in Swift - ios

I am trying to upload profile image to server using multipart file upload.
My code is
func uploadPhoto(image: UIImage, filePath: String, completion: #escaping uploadPhotoClosure) {
let imageData = image.jpegData(compressionQuality: 0.3)
let url = "https:www.somepath.com/uploadFile"
var request = URLRequest(url: URL(string: url)!)
request.httpMethod = "POST"
let boundary = UUID().uuidString
let contentType = "multipart/form-data; boundary=\(boundary)"
request.addValue(contentType, forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
var body = Data()
body.append("\r\n--\(boundary)--\r\n".data(using: String.Encoding.utf8)!)
body.append("Content-Disposition: form-data; name=\"file\"\r\n\r\n".data(using: String.Encoding.utf8)!)
body.append("field_mobileinfo_image".data(using: String.Encoding.utf8, allowLossyConversion: true)!)
body.append("\r\n--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
body.append("Content-Disposition: form-data; name=\"files[field_mobileinfo_image]\"; filename=\"img.jpg\"\r\n".data(using: String.Encoding.utf8)!)
body.append("Content-Type: application/octet-stream\r\n\r\n".data(using: String.Encoding.utf8)!)
body.append(imageData!)
body.append("\r\n--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
request.httpBody = body
self.serviceManager.async(request: request) { (innerClosure) in
do {
let response = try innerClosure()
guard let json = response.jsonObject else {
completion({ throw JSONErrorType.parsingError })
return
}
let jsonData = try JSONSerialization.data(withJSONObject: json, options: [])
let responseModel = try JSONDecoder().decode(EditProfilePhotoUploadResponse.self, from: jsonData)
completion({ return responseModel })
} catch {
completion({ throw error })
}
}
}
//servicemanager class
func async(request: URLRequest, completion: #escaping ServiceManagerAsyncCompletion) {
ServiceManager.log(request)
let task = self.urlSession.dataTask(with: request) { (data, response, error) in
guard error == nil else {
DispatchQueue.main.async {
completion({ throw error! })
}
return
}
guard let response = response as? HTTPURLResponse else {
DispatchQueue.main.async {
completion({ throw ServiceErrorType.invalidResponse })
}
return
}
ServiceManager.log(response, withBody: data)
//here handling status code
}
}
And the error from server is below
{
"status" : 500,
"message" : "Required request part 'file' is not present",
"timestamp" : "2022-08-05T05:30:55.415+0000",
"path" : "/uploadFile",
"error" : "Internal Server Error"
}
Any suggestions?

As your code does not contain a reproduclible example, this is just a long shot.
The final boundary is definitely wrong. It has to end with two "-" ticks.
e.g.
body.append("\r\n--\(boundary)--\r\n".data(using: String.Encoding.utf8)!)
but there might be more going on here.
Good article on multipart form data
RFC
The boundary header can be an arbitary string. But it has to be unique in the request to seperate it from the datastream. Also in the body it has to start with two "-" and the last boundary line in the request has to end with two "-" ticks also.

Related

Server response throwing Unable to process while uploading document/Photo to server in Swift

I am trying to uploading document to server. In Action sheet, User can choose Photo from gallery to Document to upload.
So, I am taking either photo or document and converting it into Data.
After that I am sending that data to server along with two parameters (keys, values) with multipart.
But, Unfortunately I am getting error like Unable to process from server, But same thing working in Android domain.
Here is my code:
func uploadDocument(documentId:Int, data: Data, filePath: String, categoryType: String, completion: #escaping uploadDocumentClosure) {
let url = "https://somedomain.com/uploadDocument"
let requestURL = URL(string: url)!
let request = NSMutableURLRequest(url: requestURL)
request.cachePolicy = .reloadIgnoringLocalCacheData
request.httpShouldHandleCookies = false
request.timeoutInterval = 30
request.httpMethod = "POST"
let filename = "avatar.png"
// generate boundary string using a unique per-app string
let boundary = UUID().uuidString
let docData = data
let idStr = "id"
let docTypeStr = "documentType"
let file = "file"
var data = Data()
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
request.addValue("Bearer \(accessToken ?? "")", forHTTPHeaderField: "Authorization")
request.httpMethod = "POST"
data.append("\r\n--\(boundary)\r\n".data(using: .utf8)!)
data.append("Content-Disposition: form-data; name=\"\(docTypeStr)\"\r\n\r\n".data(using: .utf8)!)
data.append("\(categoryType)".data(using: .utf8)!)
data.append("\r\n--\(boundary)\r\n".data(using: .utf8)!)
data.append("Content-Disposition: form-data; name=\"\(file)\"\r\n\r\n".data(using: .utf8)!)
// Add the image data to the raw http request data
data.append("\r\n--\(boundary)\r\n".data(using: .utf8)!)
// data.append("Content-Disposition: form-data; name=\"file\"; filename=\"\(filename)\"\r\n".data(using: .utf8)!)
//
if let dataa = "Content-Disposition: form-data; name=\"\(filename)\"; filename=\"image.jpg\"\r\n".data(using: .utf8) {
data.append(dataa)
}
data.append("Content-Type: image/png\r\n\r\n".data(using: .utf8)!)
data.append(docData)
data.append("\r\n--\(boundary)--\r\n".data(using: .utf8)!)
self.serviceManager.async(request: request as URLRequest) { (innerClosure) in
do {
let response = try innerClosure()
guard let json = response.jsonObject else {
completion({ throw JSONErrorType.parsingError })
return
}
let jsonData = try JSONSerialization.data(withJSONObject: json, options: [])
let responseModel = try JSONDecoder().decode(EditProfilePhotoUploadResponse.self, from: jsonData)
completion({ return responseModel })
} catch {
completion({ throw error })
}
}
}
And the sever response is below
{
"status" : "E",
"message" : "Unable to process.",
"data" : null,
"messageList" : null
}
With status code 400 bad request.
In Android they simply sending below code and its working fine.
#Multipart
#POST("somedomain.com/uploadDocument")
suspend fun uploadDocument(
#Part file: MultipartBody.Part,
#Query("documentType") documentType: String
): GenericMessageResponse
Any suggestions?
After much debugging, I have fixed the issue with below solution.
I used below library
https://github.com/Fyrts/Multipart.git
Here my code changes are below
func uploadDocument(imageData: Data, filePath: String, fileName: String, categoryType: String, completion: #escaping uploadDocumentClosure) {
let url = "https://wwww.somedomain.com/uploadDocument"
let requestURL = URL(string: url)!
let imageeData = ImageData(name: fileName, filePath: filePath, imagedata: imageData)
let string = imageeData.filePath
let mimeType = string.mimeType() //here list of mimes we can get from predefined
let fileContents = try! Data(contentsOf: URL(string: filePath)!)
var message = Multipart(type: .formData)
message.append(Part.FormData(name: "documentType", value: "\(categoryType)"))
message.append(Part.FormData(name: "file", fileData: fileContents, fileName: "\(imageeData.name)", contentType: "\(mimeType)"))
var URLrequest = URLRequest(url: requestURL)
URLrequest.httpMethod = "POST"
URLrequest.setMultipartBody(message)
URLrequest.addValue("/(token)", forHTTPHeaderField: "Authorization")
self.serviceManager.async(request: URLrequest as URLRequest) { (innerClosure) in
do {
let response = try innerClosure()
guard let json = response.jsonObject else {
completion({ throw JSONErrorType.parsingError })
return
}
let jsonData = try JSONSerialization.data(withJSONObject: json, options: [])
let responseModel = try JSONDecoder().decode(EditProfilePhotoUploadResponse.self, from: jsonData)
completion({ return responseModel })
} catch {
completion({ throw error })
}
}
}

How to send the image file with value as image, key as 'file'

As I am new to iOS, am stuck here for a while, I need to upload the image to a server with key and value as ("file": image), find the image as attached in postman.
I have tried almost every suggestion here How to upload images to a server in iOS with Swift?, Upload image to server - Swift 3
Here I have tried something but not getting output response because of the key not passed in the request
let url = URL(string: uploadurl);
let request = NSMutableURLRequest(url: url!);
request.httpMethod = "POST"
let boundary = "Boundary-\(NSUUID().uuidString)"
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
let imageData = UIImageJPEGRepresentation(image, 1)
if (imageData == nil) {
print("UIImageJPEGRepresentation return nil")
return
}
let body = NSMutableData()
//here I need to pass the data as ["file":image]
body.append(imageData!)
request.httpBody = body as Data
let task = URLSession.shared.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
if let data = data {
// do
let json = try!JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? NSDictionary
print("json value \(json)")
} else if let error = error {
print(error.localizedDescription)
}
})
task.resume()
Please suggest me, how to pass the these image in body as ["file": image].
Thanks in advance
You could use URLSession to upload a multipart/form-data
The upload
The function to upload the image
// build request URL
guard let requestURL = URL(string: "YOURURL") else {
return
}
// prepare request
var request = URLRequest(url: requestURL)
request.allHTTPHeaderFields = header
request.httpMethod = MethodHttp.post.rawValue
let boundary = generateBoundaryString()
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
// built data from img
if let imageData = image.jpegData(compressionQuality: 1) {
request.httpBody = createBodyWithParameters(parameters: param, filePathKey: "file", imageDataKey: imageData, boundary: boundary)
}
let task = URLSession.shared.dataTask(with: request,
completionHandler: { (data, _, error) -> Void in
if let data = data {
debugPrint("image uploaded successfully \(data)")
} else if let error = error {
debugPrint(error.localizedDescription)
}
})
task.resume()
The body
the function that will create the request body
func createBodyWithParameters(parameters: [String: String],
filePathKey: String,
imageDataKey: Data,
boundary: String) -> Data {
let body = NSMutableData()
let mimetype = "image/*"
body.append("--\(boundary)\r\n".data(using: .utf8) ?? Data())
body.append("Content-Disposition: form-data; name=\"\(filePathKey)\"; filename=\"\(filePathKey)\"\r\n".data(using: .utf8) ?? Data())
body.append("Content-Type: \(mimetype)\r\n\r\n".data(using: .utf8) ?? Data())
body.append(imageDataKey)
body.append("\r\n".data(using: .utf8) ?? Data())
body.append("--\(boundary)--\r\n".data(using: .utf8) ?? Data())
return body as Data
}
private func generateBoundaryString() -> String {
return "Boundary-\(Int.random(in: 1000 ... 9999))"
}
}
Data extension
extension NSMutableData {
func appendString(_ string: String) {
if let data = string.data(using: String.Encoding.utf8,
allowLossyConversion: true) {
append(data)
}
}
}
Try this. Save the file in documentDirectory. Add the file in body with boundary which is a random string. Then add the key of the file as name=\"file\"
if !fileName.isEmpty {
let pathComponents = [NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last!, fileName]
outputFileURL = NSURL.fileURL(withPathComponents: pathComponents) //get the image file from documentDirectory
//add file to body (name=\"file\")
body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
body.append("Content-Disposition: form-data; name=\"file\"; filename=\"image.jpeg\"\r\n".data(using: String.Encoding.utf8)!)
body.append("Content-Type: image/*\r\n\r\n".data(using: String.Encoding.utf8)!)
do {
try body.append(Data(contentsOf: outputFileURL!))
} catch {
print(error)
}
body.append("\r\n".data(using: String.Encoding.utf8)!)
body.append("--\(boundary)--\r\n".data(using: String.Encoding.utf8)!)
}

No HTTP resource was found that matches the request URI web api using ASP.NET for ios Swift

I need to send POST request to the server and these are the parameters
let params : NSDictionary = ["userid":"\(userID)","sessionid":"\(sessionID)","site_id": "\(siteIDParam)", "latitude":"\(currentlatitude)", "longitude":"\(currentlongitude)", "action": "1", "comments":commentTextView.text ?? ""]
But the problem is I need to send image as byte array and i am using the following code (Swift 3)
func uploadImageRequest(image: UIImage? , urlString: String, imageName : String ,param: [String: AnyObject]? , completion:#escaping(_ success:Bool , _ object : AnyObject?) -> ())
{
let url = NSURL(string: urlString)
let request = NSMutableURLRequest(url: url! as URL)
request.httpMethod = "POST"
let boundary = generateBoundaryString()
//define the multipart request type
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
if (image == nil)
{
return
}
let image_data = UIImageJPEGRepresentation(image!, 0.5)
if(image_data == nil)
{
return
}
let body = NSMutableData()
let fname = "photo.png"
let mimetype = "image/*"
body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
body.append("Content-Disposition:form-data; name=\"\(imageName)\"; 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(image_data!)
body.append("\r\n".data(using: String.Encoding.utf8)!)
body.append("--\(boundary)--\r\n".data(using: String.Encoding.utf8)!)
if param != nil {
for (key, value) in param! {
body.append("--\(boundary)\r\n")
body.append("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n")
body.append("\(value)\r\n")
}
}
request.httpBody = body as Data
_ = URLSession.shared.dataTask(with: request as URLRequest) { (data, response, error) -> Void in
if let data = data {
// Json Response
let json = try? JSONSerialization.jsonObject(with: data, options: [])
// response.
if let response = response as? HTTPURLResponse , 200...299 ~= response.statusCode {
completion(true, json as AnyObject?)
} else {
completion(false, json as AnyObject?)
}
} else {
completion(false, error?.localizedDescription as AnyObject?)
}
}.resume()
}
The image is not converted properly I guess so that the response get failed when triggered and I am getting the following error
Message = "No HTTP resource was found that matches the request URI
This API works fine in Android device but it cant be achievied in iOS. I have searched all the links and I couldnt get a proper solution for this. I have also tried using Alamofire but still I got the same error.
You have to set the NSAllowsArbitraryLoads key to YES under NSAppTransportSecurity dictionary in your .plist file.
You can do this easily using alamofire, use the following code to do these things done.
let multipartHeaders = ["Content-Type":"multipart/form-data"]
let paramString: String = "parameters in json string..."
Alamofire.upload(multipartFormData: { (multipartFormData) in
multipartFormData.append(paramString.data(using: .utf8)!, withName: "json")
multipartFormData.append(<imageDataHere>, withName: "myimage", fileName: "myImage.jpeg", mimeType: "image
jpeg")
}, usingThreshold: SessionManager.multipartFormDataEncodingMemoryThreshold, to: url, method: .post, headers:
multipartHeader) { (encodingResult) in
switch encodingResult {
case .success(let request, _, _):
request.responseJSON(completionHandler: { (response) in
print(response)
})
case .failure(let error):
print(error.localizedDescription)
}
}
This piece of code helped me solve my problem. I just send my image as a file and remaining parameters as a string without appending it to my multipart body.
let imageData = UIImageJPEGRepresentation(userImage, 0.2)!
let docDir = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
let imageURL = docDir.appendingPathComponent("tmp.jpg")
try! imageData.write(to: imageURL)
let multipartHeaders = ["Content-Type":"multipart/form-data"]
let paramString: String = "userid=\(userId)&action=1"
Alamofire.upload(multipartFormData: { (multipartFormData) in
multipartFormData.append(imageURL, withName: "profilepic")
}, usingThreshold: SessionManager.multipartFormDataEncodingMemoryThreshold, to: URL(string: ATTENDANCE_URL+paramString)!, method: .post, headers:
multipartHeaders) { (encodingResult) in
switch encodingResult {
case .success(let request, _, _):
request.responseJSON(completionHandler: { (response) in
print(response.result.value)
let value = response.result.value as! [String: Any]
})
case .failure(let error):
print(error.localizedDescription)
}
}

Upload image to server Swift 3

I'm trying to upload an image to a server in iOS using Swift 3, I've tried with Alamofire but it's not working, so I just searched for another solution here in this forum but without luck.
I found some answers that said that the problem could have been server side, but, on Android the image is uploading correctly.
This is my upload function in swift 3:
func uploadImage(image: UIImage){
let imageData = UIImageJPEGRepresentation(image, 0.1)!
let session = URLSession(configuration: URLSessionConfiguration.default)
guard let url = URL(string: uploadPicUrl) /* your API url */) else { return }
var request = URLRequest(url: url)
request.httpMethod = "POST"
let boundary = "---------------------------14737809831466499882746641449"
let contentType = "multipart/form-data; boundary=\(boundary)"
request.addValue(contentType, forHTTPHeaderField: "Content-Type")
var body = Data()
body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
body.append("Content-Disposition: form-data; name=\"userfile\"; filename=\"img.jpg\"\r\n".data(using: String.Encoding.utf8)!)
body.append("Content-Transfer-Encoding: binary\r\n\r\n".data(using: String.Encoding.utf8)!)
body.append(imageData)
body.append("\r\n".data(using: String.Encoding.utf8)!)
body.append("--\(boundary)--\r\n".data(using: String.Encoding.utf8)!)
request.httpBody = body
print("request", request.debugDescription)
print("body", body.debugDescription)
let dataTask = session.dataTask(with: request) { (data, response, error) in
if let error = error {
print("Something went wrong: \(error)")
}
if let response = response {
print("Response: \n \(response)")
}
}
dataTask.resume()
}
Without using Alamofire, you can do the following:
func uploadImage(chosenimage: UIImage) {
let url = ApiList.base_url + ApiList.uploadFile_Url
let myUrl = NSURL(string: url)
let image_data = UIImagePNGRepresentation(chosenimage)
let tempData = NSMutableData()
let request = NSMutableURLRequest(url:myUrl! as URL)
request.httpMethod = "POST"
let boundary = NSUUID().uuidString
request.addValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField:"Content-Type")
let mimetype = "image/png"
let fname = "test.png"
self.body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
self.body.append("Content-Disposition:form-data; name=\"profileUrl\"; filename=\"\(fname)\"\r\n".data(using: String.Encoding.utf8)!)
self.body.append("Content-Type: \(mimetype)\r\n\r\n".data(using: String.Encoding.utf8)!)
self.body.append(image_data!)
self.body.append("\r\n".data(using: String.Encoding.utf8)!)
let accessToken = UserDefaults.standard.value(forKey: "accessToken") as? String ?? ""
let deviceToken = UserDefaults.standard.value(forKey: "deviceToken") as? String ?? singletonclass.instance.getDeviceToken
let param = [
"accessToken":accessToken,
"deviceId":deviceToken,
"deviceType":"2"
]
for (key,value) in param {
tempData.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
tempData.append("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n".data(using: String.Encoding.utf8)!)
tempData.append("\(value)\r\n".data(using: String.Encoding.utf8)!)
}
self.body.append(tempData as Data)
self.body.append("--\(boundary)--\r\n".data(using: String.Encoding.utf8)!)
request.httpBody = self.body as Data
let session = URLSession.shared
let task = session.dataTask(with: request as URLRequest) {
(
data, response, error) in
guard let _:NSData = data! as NSData, let _:URLResponse = response, error == nil else { return }
do
{
let responseDict = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.allowFragments) as! [String:Any]
//print("\n tyiukmqw",responseDict)
let code = responseDict.value(forKey: "code") as? String
let message = responseDict.value(forKey: "Message") as? String
singletonclass.instance.isrofilePicChagedOrNot = false
if code == "200"
{
print("success code")
DispatchQueue.main.async(execute: {
self.userProfile.image = chosenimage
UserDefaults.standard.setValue(UIImagePNGRepresentation(chosenimage), forKey: "UserProfilePicture")
singletonclass.instance.userProPic = chosenimage
})
}
else
{
DispatchQueue.main.async(execute: {
singletonclass.instance.showAlert(message!)
self.isActivityIndicatorNeed(false)
})
}
}
catch
{
}
}
task.resume()
}
Note : This function is to upload multiple files of different type using Alamofire
// upload file to server
func uploadFiles(files: [Data],completion : #escaping uploadHandler) {
let header : HTTPHeaders = ["Content-Type" : "application/x-www-form-urlencoded"] // if there's Authorization, you may add it in header
let url = URL(string: "Enter the url here")
Alamofire.upload(multipartFormData: { (multipartFormData) in
for document in files {
let fileName = NSUUID().uuidString
multipartFormData.append(document, withName: "documents", fileName:fileName ,mimeType: "image/jpeg") // You'll have to define the proper mime time for uploading other type of files. You may achieve it by creating a struct and storing the type of each file.
}
}, usingThreshold: UInt64.init(), to:url, method: .post, headers: header) { (result) in
switch result{
case .success(let upload, _, _):
upload.responseJSON { response in
switch response.result {
case .success(_) : completion(true, nil)
case .failure(let error) :
print("Error in upload: \(error.localizedDescription)")
completion(false, nil)
}
}
case .failure(let error):
print("Error in upload: \(error.localizedDescription)")
completion(false,error)
}
}
}
typealias uploadHandler = (_ status :Bool,_ error :Error?)->()// Define this anywhere globally
While calling the function I'm passing an array of files, I converted different type of file to data and uploading them to server.
if you want to upload array of images than before calling the function .
var documents = [Data]()
for image in imageArray {
if let imgData = UIImageJPEGRepresentation(image, 1.0) {
documents.append(document)
}
}
Now you can call the upload function and pass the documents and listen to completion Handler.
Good luck .

How to do multipart/form-data post request with Swift?

let Url = String(format: "http://url/ios.php")
guard let serviceUrl = URL(string: Url) else { return }
let parameterDictionary :[String:String] = ["Episodes" : "http://url/anime/07-ghost.html"]
var request = URLRequest(url: serviceUrl)
request.httpMethod = "POST"
request.setValue("multipart/form-data", forHTTPHeaderField: "Content-Type")
request.httpBody = NSKeyedArchiver.archivedData(withRootObject: parameterDictionary)
let session = URLSession.shared
session.dataTask(with: request) { (data, response, error) in
if let response = response {
print(response)
}
if let data = data {
do {
let json = try JSONSerialization.jsonObject(with: data, options: [])
print(json)
}catch {
print(error)
}
}
}.resume()
}
I get error
Error Domain=NSCocoaErrorDomain Code=3840 "No value." UserInfo={NSDebugDescription=No value.}
not sure if im sending data correctly, i think im setting httpbody incorectly
i even tried with json
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
guard let httpBody = try? JSONSerialization.data(withJSONObject: parameterDictionary, options: []) else {
return
}
Swift 3,
Try this, Remove responseHandler parameter and any other if not use in your code
class func API_POST_FORM_DATA(param:[String : String], songData:Data?, fileName:String ,responseHandler : #escaping CompletionHandler)
{
let API_URL = API_POST_ADD_SONG_TO_PLAYLIST
print("API_URL : \(API_URL)")
let request = NSMutableURLRequest(url: URL(string: API_URL)!)
request.httpMethod = "POST"
let boundary = API_Calling.generateBoundaryString()
//define the multipart request type
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
let body = NSMutableData()
let fname = fileName
let mimetype = "image/png"
//define the data post parameter
body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
body.append("Content-Disposition:form-data; name=\"test\"\r\n\r\n".data(using: String.Encoding.utf8)!)
body.append("hi\r\n".data(using: String.Encoding.utf8)!)
body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
body.append("Content-Type: \(mimetype)\r\n\r\n".data(using: String.Encoding.utf8)!)
if let songRawData = songData
{
body.append("Content-Disposition:form-data; name=\"song\"; filename=\"\(fname)\"\r\n".data(using: String.Encoding.utf8)!)
body.append(songRawData)
}
body.append("\r\n".data(using: String.Encoding.utf8)!)
body.append("--\(boundary)--\r\n".data(using: String.Encoding.utf8)!)
for (key, value) in param
{
body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
body.append("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n".data(using: String.Encoding.utf8)!)
body.append("\(value)\r\n".data(using: String.Encoding.utf8)!)
}
request.httpBody = body as Data
// return body as Data
print("Fire....")
let session = URLSession.shared
let task = session.dataTask(with: request as URLRequest) {
(
data, response, error) in
print("Complete")
if error != nil
{
print("error upload : \(error)")
responseHandler(nil)
return
}
do
{
if let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String: Any]
{
responseHandler(json as NSDictionary?)
}else
{
print("Invalid Json")
}
}
catch
{
print("Some Error")
responseHandler(nil)
}
}
task.resume()
}
class func generateBoundaryString() -> String {
return "Boundary-\(NSUUID().uuidString)"
}

Resources