使用Alamofire上传带有参数的文件

我正在尝试使用Alamofire上传文件。 上传工作正常使用文件( NSUrl )时,但是,我似乎无法弄清楚如何使用NSData选项?

这是我作为一个testing:

  var url:NSURL = NSURL.URLWithString("http://localhost:8080/bike.jpeg") var err: NSError? var imageData :NSData = NSData.dataWithContentsOfURL(url,options: NSDataReadingOptions.DataReadingMappedIfSafe, error: &err) Alamofire.upload(.POST, "http://localhost:8080/rest/service/upload/test.png", imageData) .progress { (bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) in println(totalBytesWritten) } .responseJSON { (request, response, JSON, error) in println(request) println(response) println(JSON) } 

我得到一个状态码415?

另外,我怎样才能发送上传附加参数?

谢谢

编辑

我没有设置正确的Content-Type:

 var manager = Manager.sharedInstance manager.session.configuration.HTTPAdditionalHeaders = ["Content-Type": "application/octet-stream"] let imageData: NSMutableData = NSMutableData.dataWithData(UIImageJPEGRepresentation(imageTest.image, 30)); Alamofire.upload(.POST, "http://localhost:8080/rest/service/upload?attachmentName=file.jpg", imageData) .progress { (bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) in println(totalBytesWritten) } .responseString { (request, response, JSON, error) in println(request) println(response) println(JSON) } 

仍然无法弄清楚如何发送附加参数以及上传。

这是一个简单的函数,需要目标上传URL,参数和imageData,并返回Alamofire.upload所需的URLRequestConvertible和NSData上传带有参数的图像。

 // this function creates the required URLRequestConvertible and NSData we need to use Alamofire.upload func urlRequestWithComponents(urlString:String, parameters:Dictionary<String, String>, imageData:NSData) -> (URLRequestConvertible, NSData) { // create url request to send var mutableURLRequest = NSMutableURLRequest(URL: NSURL(string: urlString)!) mutableURLRequest.HTTPMethod = Alamofire.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 (Alamofire.ParameterEncoding.URL.encode(mutableURLRequest, parameters: nil).0, uploadData) } 

以下是如何使用它的示例(请参阅创build和发送请求):

 // init paramters Dictionary var parameters = [ "task": "task", "variable1": "var" ] // add addtionial parameters parameters["userId"] = "27" parameters["body"] = "This is the body text." // example image data let image = UIImage(named: "177143.jpg") let imageData = UIImagePNGRepresentation(image) // CREATE AND SEND REQUEST ---------- let urlRequest = urlRequestWithComponents("http://example.com/uploadText/", parameters: parameters, imageData: imageData) Alamofire.upload(urlRequest.0, urlRequest.1) .progress { (bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) in println("\(totalBytesWritten) / \(totalBytesExpectedToWrite)") } .responseJSON { (request, response, JSON, error) in println("REQUEST \(request)") println("RESPONSE \(response)") println("JSON \(JSON)") println("ERROR \(error)") } 

如果您需要目标url的php文件(在同一目录中有一个“uploads”文件夹):

 // get picture variables $file = $_FILES['file']['tmp_name']; $fileName = $_FILES['file']['name']; $fileType = $_FILES['file']['type']; // check extension $allowedExts = array("jpg", "jpeg", "png"); $rootName = reset(explode(".", $fileName)); $extension = end(explode(".", $fileName)); // create new file name $time = time(); $newName = $rootName.$time.'.'.$extension; // temporarily save file $moved = move_uploaded_file($_FILES["file"]["tmp_name"], "uploads/".$newName ); if ($moved) $path = "uploads/".$newName; $body = $_POST['body']; $userId = $_POST['userId']; $time = time(); if ($moved) { $fullUrl = "http://antiblank.com/testPhotoUpload/".$path; $arrayToSend = array('status'=>'success','time'=>$time,'body'=>$body,'userId'=>$userId, "imageURL"=>$fullUrl); } else { $arrayToSend = array('status'=>'FAILED','time'=>$time,'body'=>$body,'userId'=>$userId); } header('Content-Type:application/json'); echo json_encode($arrayToSend); 

通过Swift 3&4和Alamofire 4上传带有参数自定义标题的照片/文件

 // import Alamofire func uploadWithAlamofire() { let image = UIImage(named: "bodrum")! // define parameters let parameters = [ "hometown": "yalikavak", "living": "istanbul" ] Alamofire.upload(multipartFormData: { multipartFormData in if let imageData = UIImageJPEGRepresentation(image, 1) { multipartFormData.append(imageData, withName: "file", fileName: "file.png", mimeType: "image/png") } for (key, value) in parameters { multipartFormData.append((value?.data(using: .utf8))!, withName: key) }}, to: "upload_url", method: .post, headers: ["Authorization": "auth_token"], encodingCompletion: { encodingResult in switch encodingResult { case .success(let upload, _, _): upload.response { [weak self] response in guard let strongSelf = self else { return } debugPrint(response) } case .failure(let encodingError): print("error:\(encodingError)") } }) } 

通过Swift 2和Alamofire 3

  // import Alamofire func uploadWithAlamofire() { let image = UIImage(named: "myImage")! // define parameters let parameters = [ "hometown": "yalikavak", "living": "istanbul" ] // Begin upload Alamofire.upload(.POST, "upload_url", // define your headers here headers: ["Authorization": "auth_token"], multipartFormData: { multipartFormData in // import image to request if let imageData = UIImageJPEGRepresentation(image, 1) { multipartFormData.appendBodyPart(data: imageData, name: "file", fileName: "myImage.png", mimeType: "image/png") } // import parameters for (key, value) in parameters { multipartFormData.appendBodyPart(data: value.dataUsingEncoding(NSUTF8StringEncoding)!, name: key) } }, // you can customise Threshold if you wish. This is the alamofire's default value encodingMemoryThreshold: Manager.MultipartFormDataEncodingMemoryThreshold, encodingCompletion: { encodingResult in switch encodingResult { case .Success(let upload, _, _): upload.responseJSON { response in debugPrint(response) } case .Failure(let encodingError): print(encodingError) } }) } 

这里是一个解决scheme使用Alamofire 3.0基于antiblanks回答:

  let parameters = [ "par1": "value", "par2": "value2"] let URL = "YOUR_URL.php" let image = UIImage(named: "image.png") Alamofire.upload(.POST, URL, multipartFormData: { multipartFormData in if let _image = image { if let imageData = UIImageJPEGRepresentation(_image, 0.5) { multipartFormData.appendBodyPart(data: imageData, name: "file", fileName: "file.png", mimeType: "image/png") } } for (key, value) in parameters { multipartFormData.appendBodyPart(data: value.dataUsingEncoding(NSUTF8StringEncoding)!, name: key) } }, encodingCompletion: { encodingResult in switch encodingResult { case .Success(let upload, _, _): upload.responseObject { (response: Response<UploadData, NSError>) -> Void in switch response.result { case .Success: completionHandler?(success: true) case .Failure(let error): completionHandler?(success: false) } } case .Failure(let encodingError): print(encodingError) } }) 

提高EdFunke对Swift 2.2 Alamofire 3.3.1的回答

 Alamofire.upload(.POST, urlString, multipartFormData: { multipartFormData in if let _image = self.profilePic.image { if let imageData = UIImagePNGRepresentation(_image) { multipartFormData.appendBodyPart(data: imageData, name: "user_image", fileName: "file.png", mimeType: "image/png") } } for (key, value) in userInfo { multipartFormData.appendBodyPart(data: value.dataUsingEncoding(NSUTF8StringEncoding)!, name: key) } }, encodingCompletion: { encodingResult in switch encodingResult { case .Success(let upload, _, _): upload.responseJSON { response in debugPrint(response) } case .Failure(let encodingError): print(encodingError) } } ) 

计划在下一个(1.3.0)版本的Alamofire中包含分段上传。 同时,使用这个线程中的信息,我创build了一个简化上传文件的类,并在请求中包含附加参数(常规“input”)以及一个或多个文件。 不要假设文件属于特定types或使用路由器。

FileUploader.swift:

 import Foundation import Alamofire private struct FileUploadInfo { var name:String var mimeType:String var fileName:String var url:NSURL? var data:NSData? init( name: String, withFileURL url: NSURL, withMimeType mimeType: String? = nil ) { self.name = name self.url = url self.fileName = name self.mimeType = "application/octet-stream" if mimeType != nil { self.mimeType = mimeType! } if let _name = url.lastPathComponent { fileName = _name } if mimeType == nil, let _extension = url.pathExtension { switch _extension.lowercaseString { case "jpeg", "jpg": self.mimeType = "image/jpeg" case "png": self.mimeType = "image/png" default: self.mimeType = "application/octet-stream" } } } init( name: String, withData data: NSData, withMimeType mimeType: String ) { self.name = name self.data = data self.fileName = name self.mimeType = mimeType } } class FileUploader { private var parameters = [String:String]() private var files = [FileUploadInfo]() private var headers = [String:String]() func setValue( value: String, forParameter parameter: String ) { parameters[parameter] = value } func setValue( value: String, forHeader header: String ) { headers[header] = value } func addParametersFrom( #map: [String:String] ) { for (key,value) in map { parameters[key] = value } } func addHeadersFrom( #map: [String:String] ) { for (key,value) in map { headers[key] = value } } func addFileURL( url: NSURL, withName name: String, withMimeType mimeType:String? = nil ) { files.append( FileUploadInfo( name: name, withFileURL: url, withMimeType: mimeType ) ) } func addFileData( data: NSData, withName name: String, withMimeType mimeType:String = "application/octet-stream" ) { files.append( FileUploadInfo( name: name, withData: data, withMimeType: mimeType ) ) } func uploadFile( request sourceRequest: NSURLRequest ) -> Request? { var request = sourceRequest.mutableCopy() as! NSMutableURLRequest let boundary = "FileUploader-boundary-\(arc4random())-\(arc4random())" request.setValue( "multipart/form-data;boundary=\(boundary)", forHTTPHeaderField: "Content-Type") let data = NSMutableData() for (name, value) in headers { request.setValue(value, forHTTPHeaderField: name) } // Amazon S3 (probably others) wont take parameters after files, so we put them first for (key, value) in parameters { data.appendData("\r\n--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) data.appendData("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n\(value)".dataUsingEncoding(NSUTF8StringEncoding)!) } for fileUploadInfo in files { data.appendData( "\r\n--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)! ) data.appendData( "Content-Disposition: form-data; name=\"\(fileUploadInfo.name)\"; filename=\"\(fileUploadInfo.fileName)\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) data.appendData( "Content-Type: \(fileUploadInfo.mimeType)\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) if fileUploadInfo.data != nil { data.appendData( fileUploadInfo.data! ) } else if fileUploadInfo.url != nil, let fileData = NSData(contentsOfURL: fileUploadInfo.url!) { data.appendData( fileData ) } else { // ToDo: report error return nil } } data.appendData("\r\n--\(boundary)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) return Alamofire.upload( request, data ) } } 

它会像这样使用:

 // This example uploads a file called example.png found in the app resources let fileURL = NSBundle.mainBundle().URLForResource("example", withExtension: "png") let fileUploader = FileUploader() // we can add multiple files // this would be equivalent to: <input type="file" name="myFile"/> fileUploader.addFileURL(fileURL!, withName: "myFile") // we can add NSData objects directly let data = UIImage(named: "sample") fileUploader.addFileData( UIImageJPEGRepresentation(data,0.8), withName: "mySecondFile", withMimeType: "image/jpeg" ) // we can also add multiple aditional parameters // this would be equivalent to: <input type="hidden" name="folderName" value="sample"/> fileUploader.setValue( "sample", forParameter: "folderName" ) // put your server URL here var request = NSMutableURLRequest( URL: NSURL(string: "http://myserver.com/uploadFile" )! ) request.HTTPMethod = "POST" fileUploader.uploadFile(request: request) 

查看或从这个要点下载: https : //gist.github.com/ncerezo/b1991f8dfac01cb162c0

@ antiblank的答案中的代码不适合我。 我做了一些改变,现在正在工作:

 func urlRequestWithComponents(urlString:String, parameters:NSDictionary) -> (URLRequestConvertible, NSData) { // create url request to send var mutableURLRequest = NSMutableURLRequest(URL: NSURL(string: urlString)!) mutableURLRequest.HTTPMethod = Alamofire.Method.POST.rawValue //let boundaryConstant = "myRandomBoundary12345" let boundaryConstant = "NET-POST-boundary-\(arc4random())-\(arc4random())" let contentType = "multipart/form-data;boundary="+boundaryConstant mutableURLRequest.setValue(contentType, forHTTPHeaderField: "Content-Type") // create upload data to send let uploadData = NSMutableData() // add parameters for (key, value) in parameters { uploadData.appendData("\r\n--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) if value is NetData { // add image var postData = value as NetData //uploadData.appendData("Content-Disposition: form-data; name=\"\(key)\"; filename=\"\(postData.filename)\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) // append content disposition var filenameClause = " filename=\"\(postData.filename)\"" let contentDispositionString = "Content-Disposition: form-data; name=\"\(key)\";\(filenameClause)\r\n" let contentDispositionData = contentDispositionString.dataUsingEncoding(NSUTF8StringEncoding) uploadData.appendData(contentDispositionData!) // append content type //uploadData.appendData("Content-Type: image/png\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) // mark this. let contentTypeString = "Content-Type: \(postData.mimeType.getString())\r\n\r\n" let contentTypeData = contentTypeString.dataUsingEncoding(NSUTF8StringEncoding) uploadData.appendData(contentTypeData!) uploadData.appendData(postData.data) }else{ 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 (Alamofire.ParameterEncoding.URL.encode(mutableURLRequest, parameters: nil).0, uploadData) } 

使用:

 let docDir:AnyObject = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] let imagePath = docDir + "/myPic.jpg" var imageData = NSData(contentsOfFile: imagePath, options: NSDataReadingOptions.DataReadingMappedIfSafe, error: nil) var parameters = [ "pic" :NetData(nsData: imageData!, filename: "customName.jpg"), "otherParm" :"Value" ] let urlRequest = self.urlRequestWithComponents("http://www.example.com/upload.php", parameters: parameters) 

来自https://github.com/nghialv/Net/blob/master/Net/NetData.swift的NetData

upload.php代码:

 <?php // In PHP versions earlier than 4.1.0, $HTTP_POST_FILES should be used instead // of $_FILES. $uploaddir = 'uploads/'; // PS: custom filed name : pic $uploadfile = $uploaddir . basename($_FILES['pic']['name']); if (move_uploaded_file($_FILES['pic']['tmp_name'], $uploadfile)) { $array = array ("code" => "1", "message" => "successfully"); } else { $array = array ("code" => "0", "message" => "Possible file upload attack!".$_FILES['pic']['name']); } echo json_encode ( $array ); ?> 

基于@antiblank和@VincentYan答案更短的版本。

 class Photo { class func upload(image: UIImage, filename: String) -> Request { let route = Router.CreatePhoto() var request = route.URLRequest.mutableCopy() as NSMutableURLRequest let boundary = "NET-POST-boundary-\(arc4random())-\(arc4random())" request.setValue("multipart/form-data;boundary="+boundary, forHTTPHeaderField: "Content-Type") let parameters = NSMutableData() for s in ["\r\n--\(boundary)\r\n", "Content-Disposition: form-data; name=\"photos[photo]\";" + " filename=\"\(filename)\"\r\n", "Content-Type: image/png\r\n\r\n"] { parameters.appendData(s.dataUsingEncoding(NSUTF8StringEncoding)!) } parameters.appendData(UIImageJPEGRepresentation(image, 1)) parameters.appendData("\r\n--\(boundary)--\r\n" .dataUsingEncoding(NSUTF8StringEncoding)!) return Alamofire.upload(request, parameters) } } 

用法

 let rep = (asset as ALAsset).defaultRepresentation() let ref = rep.fullResolutionImage().takeUnretainedValue() Photo.upload(UIImage(CGImage: ref)!, filename: rep.filename()) .progress { (bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) in println(totalBytesWritten) } .responseJSON { (request, response, JSON, error) in println(JSON) } 

虽然还有其他的build议如何手动构build多部分请求的答案,你可能只想坚持AFNetworking。 尽pipe它是用Objective-C编写的,但仍然可以在Swift项目中使用它(请参阅同一项目中的Swift和Objective-C )。 无论如何,使用AFNetworking提交多部分请求的Swift代码如下所示:

 let data = UIImagePNGRepresentation(image) let manager = AFHTTPSessionManager() manager.POST(uploadURLString, parameters: nil, constructingBodyWithBlock: { formData in formData.appendPartWithFileData(data, name: "image", fileName: "test.png", mimeType: "image/png") }, success: { operation, responseObject in println(responseObject) }) { operation, error in println(error) } 

Xcode讨厌有识别这个id<AFMultipartFormData>参数formData ,所以你不喜欢appendPartWithFileData方法或其参数的典型编辑代码完成,但是当你编译它并运行它时,它工作正常。

由于缺less请求中的内容types ,您正在获取415。 以下是Swift 2和AlamoFire上图片上传的完整源代码

 import UIKit import Alamofire class ViewController: UIViewController { @IBOutlet var imageView: UIImageView! @IBOutlet var btnUpload: UIButton! override func viewDidLoad() { super.viewDidLoad() } func successDataHandler(responseData:String){ print ("IMAGE UPLOAD SUCCESSFUL !!!") } func failureDataHandler(errorData:String){ print (" !!! IMAGE UPLOAD FAILURE !!! ") } @IBAction func actionUpload(sender: AnyObject) { let URL = "http://m8coreapibeta.azurewebsites.net/api/cards/SaveImages" let postDataProlife:[String:AnyObject] = ["CardId":(dataCardDetail?.userId)!,"ImageType":1,"ImageData":imageView.image!] uplaodImageData(URL, postData: postDataProlife, successHandler: successDataHandler, failureHandler: failureDataHandler) } func uplaodImageData(RequestURL: String,postData:[String:AnyObject]?,successHandler: (String) -> (),failureHandler: (String) -> ()) -> () { let headerData:[String : String] = ["Content-Type":"application/json"] Alamofire.request(.POST,RequestURL, parameters: postData, encoding: .URLEncodedInURL, headers: headerData).responseString{ response in switch response.result { case .Success: print(response.response?.statusCode) successHandler(response.result.value!) case .Failure(let error): failureHandler("\(error)") } } } } 

下面是迅捷和PHP代码

Swift代码 – > Apple Swift版本3.0.1(swiftlang-800.0.58.6 clang-800.0.42.1)目标:x86_64-apple-macosx10.9

  class func upload(jsonObject: AnyObject , files : Array<Any>? = nil , completionHandler : CompletionBlock? = nil ,failureHandler : FailureBlock? = nil ) { Alamofire.upload(multipartFormData: { (multipartFormData) in if let filesO = files { for i in (filesO.enumerated()) { let image = UIImage(named: "\(i.element)") let data = UIImageJPEGRepresentation(image!, 1)! multipartFormData.append(data, withName: "imgFiles[]" , fileName: "\( NSUUID().uuidString).jpeg" , mimeType: "image/jpeg") // imgFiles[] give array in Php Side // imgFiles will give string in PHP String } } for (key, value) in jsonObject as! [String : String] { multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key) }} }, to:baseURL) 

PHP代码获取参数和文件

这里的参数是在$ _Request中处理的

和文件在$ _File处理

格式在$ _File数据(数组,字典或string)将取决于请求在快速的一面,这里看到代码中的这一行

multipartFormData.append(data,withName:“imgFiles []”,fileName:“(NSUUID()。uuidString).jpeg”,mimeType:“image / jpeg”)

在Php方面withName:“imgFiles []”给出名称,格式,types的数组

例如

“name”:[“06748B86-478E-421B-8470-6262755AC149.jpeg”,“E70269E9-FB54-4BFD-B807-7E418C81540D.jpeg”],“type”:[“image / jpeg”,“image / jpeg” ],“tmp_name”:[“/ tmp / phpz3UAPq”,“/ tmp / phpCAPExG”],“error”:[0,0],“size”:[2779495,2067259]}

PHP代码

  if (isset($_FILES['imgFiles']) and strlen($orderId) > 0) { foreach ($_FILES['imgFiles']['tmp_name'] as $key => $tmp_name) { $file_name = $key . $_FILES['imgFiles']['name'][$key]; $file_size = $_FILES['imgFiles']['size'][$key]; $file_tmp = $_FILES['imgFiles']['tmp_name'][$key]; $file_type = $_FILES['imgFiles']['type'][$key]; if (is_dir("$desired_dir/" . $file_name) == false) { //move_uploaded_file($file_tmp, "user_data/" . $file_name); move_uploaded_file($file_tmp, $desired_dir . "/" . $file_name); } else { //rename the file if another one exist $new_dir = $desired_dir . "/" . $file_name . time(); rename($file_tmp, $new_dir); } 

我采取了antilank的答案,并把这一切与完成处理程序1function。 认为这可能对某人有用。 这是有点“粗糙”,然后antiblank的答案,因为我只是从PHP文件(而不是JSON)的string响应。

以下是您如何称呼它:

 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 } 

这个function本身:

 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<String, String>, 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) } } ) } 

这里是php文件。

 $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"; }