2015-12-30 3 views
1

Я пытаюсь отправить изображение на сервере с параметром json, используя Alamofire. Но на сервере они могут получить изображение, но не Json, который я отправляю. Ниже приведен код, который я использую:Отправка изображения на сервер с параметрами в Swift

let parameters: [String : String] = [ 
      "preferredVenueType": "club", 
      "userId": "1" 
     ] 
let urlRequest = urlRequestWithComponents(baseURL + uploadImage, parameters: parameters , imageData: imageData!) 
upload(urlRequest.0, data: urlRequest.1) 
.progress { (bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) in 
//print("\(totalBytesWritten)/\(totalBytesExpectedToWrite)") 
} 
.responseJSON {response in 
        if let JSON = response.result.value { 
         print("JSON: \(JSON)") 
} 




func urlRequestWithComponents(urlString:String, parameters:Dictionary<String, String>, imageData:NSData) -> (URLRequestConvertible, NSData) { 

     // create url request to send 
     let 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") 

     // mutableURLRequest.HTTPBody = jsonData 


     // 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=\"profileImage\"; filename=\"profileImage.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("Content-Disposition: form-data; name=\"json\"\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 

         } 
     uploadData.appendData("\r\n--\(boundaryConstant)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 



     // return URLRequestConvertible and NSData 
     return (ParameterEncoding.URL.encode(mutableURLRequest, parameters: nil).0, uploadData) 

    } 

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

+0

Вы проверили [alamo fire multipart upload] (https://github.com/Alamofire/Alamofire#user-content-uploading-multipartformdata)? –

+0

@the_UB Я тоже проверил это, но все еще не работает ... – Shruti

ответ

2

Я решил проблему, отправив параметры в качестве JSON String вместо пар значений ключа.

let parameters: [String : String] = [ 
      "preferredVenueType": prameterText, 
      "userId": userId, 
     ] 
     var theJSONText : NSString = "" 

     do { 
      let theJSONData = try NSJSONSerialization.dataWithJSONObject(
       parameters , 
       options: NSJSONWritingOptions(rawValue: 0)) 
      theJSONText = NSString(data: theJSONData, 
       encoding: NSASCIIStringEncoding)! 
      // due to some reason NSUTF8StringEncoding was not working so i used ASCII encoding 
     } catch let error as NSError { 
      print(error) 
     } 

И при отправке его на сервер я использовал

let uploadData = NSMutableData() 

     uploadData.appendData("--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
     uploadData.appendData("Content-Disposition: form-data; name=\"json\"\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
     uploadData.appendData("\(theJSONText)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 

После отправки параметров как JSON String данные были успешно загружены на сервер.

+0

У меня такая же проблема не удалось загрузить. Я хочу попробовать вашу демоверсию, но получаю использование необъявленного типа 'URLRequestConvertible'. и один запрос, если возможно, вы можете дать полный код для этого? на диске или электронной почте или другим способом, который вы предпочитаете. – jay

+0

@jay: Привет, пришлите мне свой адрес электронной почты, и я пришлю вам полный код, связанный с загрузкой изображения. – Shruti

+0

спасибо, [email protected] – jay

0

Привет, у меня нет знаний о быстром. Но, согласно вашей проблеме, сервер, получающий изображение, что означает URL-адрес, является правильным. так

1) сначала проверьте данные, отправляемые вами. может быть ваша отправка неправильного типа данных. например: серверная сторона {словарь [словарь]}, ваш перевод {словарь}, как это.

2) проверьте поля заголовка.

3) проверьте имя объектов и ключей поля заголовка (столицы или малого) каждую букву.

4), наконец, добавьте нижеприведенный код в файлы проекта .plist. Добавьте к каждому пласту в своем проекте.

<key>NSAppTransportSecurity</key> 
    <dict> 
     <key>NSAllowsArbitraryLoads</key> 
     <true/> 
</dict> 

добавить это, щелкните правой кнопкой мыши на .plist, а затем открыть его в качестве источника code.copy вышеуказанных линий и мимо линий до "</dict></plist>" в конце.

просто попробуйте это. Я не уверен в этом, это будет полезно.