Uploading file with parameters using Alamofire-open source projects Alamofire/Alamofire
I took antiblank’s answer and wrapped this all up in 1 function with completion handler. Thought it might be useful for someone. It’s a bit ‘rougher’ then antiblank’s answer as I’m simply taking a string response from the PHP file (not JSON).
Here’s how you call it:
let imageData = UIImagePNGRepresentation(myImageView.image)
uploadImage("http://www.example.com/image_upload.php", imageData: imageData, subdir: "images", filename: "imageID.png")
{ (req, res, str, err) -> Void in
// do whatever you want to to for error handling and handeling success
}
Here’s the function itself:
func uploadImage(urlToPHPFile: String, imageData: NSData, subdir: String, filename: String, completionHandler:(request:NSURLRequest, response:NSURLResponse?, responseString:String?, error: NSError?) -> ()) {
func urlRequestWithComponents(urlString:String, parameters:Dictionary, imageData:NSData) -> (URLRequestConvertible, NSData) {
// create url request to send
var mutableURLRequest = NSMutableURLRequest(URL: NSURL(string: urlString)!)
mutableURLRequest.HTTPMethod = Method.POST.rawValue
let boundaryConstant = "myRandomBoundary12345";
let contentType = "multipart/form-data;boundary="+boundaryConstant
mutableURLRequest.setValue(contentType, forHTTPHeaderField: "Content-Type")
// create upload data to send
let uploadData = NSMutableData()
// add image
uploadData.appendData("\r\n--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
uploadData.appendData("Content-Disposition: form-data; name=\"file\"; filename=\"file.png\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
uploadData.appendData("Content-Type: image/png\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
uploadData.appendData(imageData)
// add parameters
for (key, value) in parameters {
uploadData.appendData("\r\n--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
uploadData.appendData("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n\(value)".dataUsingEncoding(NSUTF8StringEncoding)!)
}
uploadData.appendData("\r\n--\(boundaryConstant)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
// return URLRequestConvertible and NSData
return (ParameterEncoding.URL.encode(mutableURLRequest, parameters: nil).0, uploadData)
}
let parameters = [
"subdir" : subdir,
"filename": filename
]
let urlRequest = urlRequestWithComponents(urlToPHPFile, parameters, imageData)
AlamoFire.upload(urlRequest.0, urlRequest.1)
.responseString(completionHandler: { [weak self] (req, res, str, err) -> Void in
if let strongSelf = self {
completionHandler(request: req, response: res, responseString: str, error: err)
}
}
)
}
And here is the php file.
$subdir = $_POST['subdir'];
$filename = $_POST["filename"];
$targetPath = $subdir.'/'.$filename;
$moved = move_uploaded_file($_FILES["file"]["tmp_name"], $targetPath );
if ($moved) {
echo "OK";
}
else {
echo "Error: file not uploaded";
}