2016-02-24 4 views
11

Я изучаю быстро, и я посылаю запрос на сервер с кодом ниже. Он работает для простого запроса, и я получаю ответ от сервера. Моя проблема в том, что я не могу отправить файл на сервер.swift, отправить файл на сервер

код:

let parameters = parameter 

    let request = NSMutableURLRequest(URL: NSURL(string: requestUrl)!) 
    let boundaryConstant = "-----Boundary+\(arc4random())\(arc4random())" 


    let contentType = "multipart/form-data; boundary=" + boundaryConstant 
    let boundaryStart = "--\(boundaryConstant)\r\n" 
    let boundaryEnd = "--\(boundaryConstant)--\r\n" 

    let body:NSMutableString = NSMutableString(); 

    for (key, value) in parameters { 
     body.appendFormat(boundaryStart) 
     body.appendFormat("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n") 
     body.appendFormat("\(value)\r\n") 
    } 
    body.appendFormat(boundaryEnd) 


    request.HTTPMethod = "POST" 
    request.setValue(contentType, forHTTPHeaderField: "Content-Type") 

    request.HTTPBody = body.dataUsingEncoding(NSUTF8StringEncoding) 

    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in 

     guard error == nil && data != nil else { 
      // check for fundamental networking error 
      print("error=\(error)") 
      return 

     } 


     if let httpStatus = response as? NSHTTPURLResponse where httpStatus.statusCode != 200 {   // check for http errors 

      print("statusCode should be 200, but is \(httpStatus.statusCode)") 
      print("response = \(response)") 
     } 


     self.responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)! 
     print("MMMMMMMM \(self.responseString)") 
     self.result = self.responseString.dataUsingEncoding(NSUTF8StringEncoding)! as NSData 
     callback(self.responseString) 

    } 

    print("code start") 
    task.resume() 

результат: я могу разместить файл на сервер с помощью этого кода:

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    let request = createRequest() 
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in 
     if error != nil { 
      // handle error here 
      print(error) 
      return 
     } 
     do { 
      if let responseDictionary = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? NSDictionary { 
       print("success == \(responseDictionary)") 

      } 
     } catch { 
      print(error) 

      let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding) 
      print("responseString = \(responseString)") 
     } 
    } 
    task.resume() 


} 

func createRequest() -> NSURLRequest { 
    let param = [] 


    let boundary = generateBoundaryString() 

    let url = NSURL(string: "URl")! 
    let request = NSMutableURLRequest(URL: url) 
    request.HTTPMethod = "POST" 
    request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type") 
    request.setValue("userValue", forHTTPHeaderField: "X-Client-user") 
    request.setValue("passValue", forHTTPHeaderField: "X-Access-pass") 


    //let path1 = NSBundle.mainBundle().pathForResource("voice", ofType: "png") as String! 
    request.HTTPBody = createBodyWithParameters(param, filePathKey: "voice", paths: ["pathURl"], boundary: boundary) 

    return request 
} 

func createBodyWithParameters(parameters: [String: String]?, filePathKey: String?, paths: [String]?, boundary: String) -> NSData { 
    let body = NSMutableData() 

    if parameters != nil { 
     for (key, value) in parameters! { 
      body.appendString("--\(boundary)\r\n") 
      body.appendString("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n") 
      body.appendString("\(value)\r\n") 
     } 
    } 

    if paths != nil { 
     for path in paths! { 
      let url = NSURL(fileURLWithPath: path) 
      let filename = url.lastPathComponent 
      let data = NSData(contentsOfURL: url)! 
      let mimetype = mimeTypeForPath(path) 

      body.appendString("--\(boundary)\r\n") 
      body.appendString("Content-Disposition: form-data; name=\"\(filePathKey!)\"; filename=\"\(filename!)\"\r\n") 
      body.appendString("Content-Type: \(mimetype)\r\n\r\n") 
      body.appendData(data) 
      body.appendString("\r\n") 
     } 
    } 

    body.appendString("--\(boundary)--\r\n") 
    return body 
} 

func generateBoundaryString() -> String { 
    return "Boundary-\(NSUUID().UUIDString)" 
} 


func mimeTypeForPath(path: String) -> String { 
    let url = NSURL(fileURLWithPath: path) 
    let pathExtension = url.pathExtension 

    if let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension! as NSString, nil)?.takeRetainedValue() { 
     if let mimetype = UTTypeCopyPreferredTagWithClass(uti, kUTTagClassMIMEType)?.takeRetainedValue() { 
      return mimetype as String 
     } 
    } 
    return "application/octet-stream"; 
} 
+0

Что такое ошибка? – JAL

+1

У меня нет никаких ошибок в этом коде, и этот код работает для меня, когда я отправляю запрос на сервер, и я получаю истинный ответ от сервера. Теперь я не знаю, как отправить аудиофайлы на сервер. –

+0

. Вы должны быть более конкретными о вашей проблеме. Вы уже пробовали какой-либо подход? Если вы это сделали, и это не сработало, тогда вы должны сообщить нам, что вы пробовали, чтобы можно было идентифицировать проблему. Если, однако, вы не делали никаких попыток, тогда вы должны сначала Google «NSURLRequest attach file» –

ответ

4

Как вы читаете здесь, вы должны использовать NSURLSession для HTTP работы, это гораздо более гибким, и мощный; и я думаю, что суждено заменить NSURLConnection ...

https://www.objc.io/issues/5-ios7/from-nsurlconnection-to-nsurlsession/

Вот вам пример ...

func getMetaData(lePath:String, completion: (string: String?, error: ErrorType?) -> Void) { 
// **** get_metadata **** 
    let request = NSMutableURLRequest(URL: NSURL(string: "https://api.dropboxapi.com/2/files/get_metadata")!) 
    let session = NSURLSession.sharedSession() 
    request.HTTPMethod = "POST" 

    request.addValue("Bearer ab-blah-blah", forHTTPHeaderField: "Authorization") 
    request.addValue("application/json",forHTTPHeaderField: "Content-Type") 
    request.addValue("path", forHTTPHeaderField: lePath) 
    let cursor:NSDictionary? = ["path":lePath] 
    do { 
     let jsonData = try NSJSONSerialization.dataWithJSONObject(cursor!, options: []) 
     request.HTTPBody = jsonData 
     print("json ",jsonData) 
    } catch { 
     print("snafoo alert") 
    } 

    let task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in 
     if let error = error { 
      completion(string: nil, error: error) 
      return 
     } 
     let strData = NSString(data: data!, encoding: NSUTF8StringEncoding) 
     print("Body: \(strData)\n\n") 
     do { 
      let jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions.MutableContainers); 
      self.jsonParser(jsonResult,field2file: "ignore") 
      for (key, value) in self.parsedJson { 
       print("key2 \(key) value2 \(value)") 
      } 

      completion(string: "", error: nil) 
     } catch { 
      completion(string: nil, error: error) 
     } 
    }) 
    task.resume() 

} 
2

Великий ответ выше .. Вот он обновляется для Swift3:

func getMetaData(lePath:String, completion: (string: String?, error: ErrorType?) -> Void) { 
// **** get_metadata **** 
    let request = NSMutableURLRequest(URL: NSURL(string: "https://api.dropboxapi.com/2/files/get_metadata")!) 
    let session = NSURLSession.sharedSession() 
    request.HTTPMethod = "POST" 

    request.addValue("Bearer ab-blah-blah", forHTTPHeaderField: "Authorization") 
    request.addValue("application/json",forHTTPHeaderField: "Content-Type") 
    request.addValue("path", forHTTPHeaderField: lePath) 
    let cursor:NSDictionary? = ["path":lePath] 
    do { 
     let jsonData = try NSJSONSerialization.dataWithJSONObject(cursor!, options: []) 
     request.HTTPBody = jsonData 
     print("json ",jsonData) 
    } catch { 
     print("snafoo alert") 
    } 

    let task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in 
     if let error = error { 
      completion(string: nil, error: error) 
      return 
     } 
     let strData = NSString(data: data!, encoding: NSUTF8StringEncoding) 
     print("Body: \(strData)\n\n") 
     do { 
      let jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions.MutableContainers); 
      self.jsonParser(jsonResult,field2file: "ignore") 
      for (key, value) in self.parsedJson { 
       print("key2 \(key) value2 \(value)") 
      } 

      completion(string: "", error: nil) 
     } catch { 
      completion(string: nil, error: error) 
     } 
    }) 
    task.resume() 

} 
Смежные вопросы