Skip to content

Instantly share code, notes, and snippets.

@Thunderbird7
Created February 11, 2016 04:07
Show Gist options
  • Save Thunderbird7/c791537bf05444550863 to your computer and use it in GitHub Desktop.
Save Thunderbird7/c791537bf05444550863 to your computer and use it in GitHub Desktop.
// This function creates the required URLRequestConvertible and NSData we need to use Alamofire.upload
func urlRequestComponentsWithParams(urlString:String, parameter: [String: AnyObject], imageData:[NSData], inputName: String) -> (URLRequestConvertible, NSData) {
// create url request to send
let mutableURLRequest = NSMutableURLRequest(URL: NSURL(string: urlString)!)
mutableURLRequest.HTTPMethod = Alamofire.Method.PUT.rawValue
let boundaryConstant = "FileUploader-boundary-\(arc4random())-\(arc4random())";
let contentType = "multipart/form-data;boundary="+boundaryConstant
mutableURLRequest.setValue(contentType, forHTTPHeaderField: "Content-Type")
// create upload data to send
let uploadData = NSMutableData()
for var i = 0; i < imageData.count; ++i {
// add image
uploadData.appendData("\r\n--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
uploadData.appendData("Content-Disposition: form-data; name=\"\(inputName)\(i+1)\"; filename=\"image\(i+1).jpg\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
uploadData.appendData("Content-Type: image/jpeg\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
uploadData.appendData(imageData[i])
}
// add parameters
for (key, value) in parameter {
uploadData.appendData("\r\n--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
uploadData.appendData("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n\(value)".dataUsingEncoding(NSUTF8StringEncoding)!)
print("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n\(value)")
}
uploadData.appendData("\r\n--\(boundaryConstant)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
print("Content-Disposition: form-data; name=\"\(inputName)\"; filename=\"image.jpg\"\r\n")
// return URLRequestConvertible and NSData
return (Alamofire.ParameterEncoding.URL.encode(mutableURLRequest, parameters: nil).0, uploadData)
}
func uploadMultipart(path: String, params: [String: AnyObject], data: [NSData], multiPartFormName: String,
success: (responseObject: AnyObject?) -> Void,
progress: (responseProgress: Float) -> Void,
failure: (error: NSError?) -> Void) {
let url = "\(self.kStringBaseURL)\(path)"
let urlRequest = urlRequestComponentsWithParams(url, parameter: params, imageData: data, inputName: multiPartFormName)
Alamofire.upload(urlRequest.0, data: urlRequest.1)
.progress { (bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) -> Void in
// println("\(totalBytesWritten) / \(totalBytesExpectedToWrite)")
return progress(responseProgress: Float(totalBytesWritten))
}
.responseString(encoding: nil) { (httpResp) -> Void in
if(httpResp.result.isFailure) {
// println("Failure: \(responseError!.userInfo)")
return failure(error: httpResp.result.error!)
} else {
if (httpResp.response?.statusCode == 200) {
return success(responseObject: httpResp.result.value!)
} else {
UIAlertView(title: "Sorry, something went wrong.", message: httpResp.result.value!, delegate: self, cancelButtonTitle: "OK").show()
SVProgressHUD.dismiss()
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment