2015-12-30 109 views
1

我正在尝试使用Alamofire在服务器上使用json参数发送图像。但在服务器上,他们能够接收图像,但不是我正在发送的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:嗨,发给我你的电子邮件ID,我会向你发送与图片上传相关的完整代码。 – Shruti

+0

谢谢,[email protected] – jay

0

嗨,我没有关于swift的知识。但根据你的问题,服务器接收图像意味着url是正确的。所以

1)首先检查你发送的数据。可能是您发送错误的数据类型。 例如:服务器端{dictionary [dictionary]},发送{字典}这样。

2)检查标题字段。

3)检查标题字段对象和键名(大写或小写)每一个字母。

4)最后在您的项目.plist文件中添加下面的代码。添加到项目中的每个plist。

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

添加此,右键单击的.plist,然后打开它的源code.copy上面的纹路和以往在年底前"</dict></plist>"线。

只是试试这个..我不确定这个,它会有用的。