2015-10-01 22 views
0

我试图创建一种采用多一个新的对象和其他一些价值观,但我无法得到它的工作。上传图像和文本值服务器

这是我用没有上传图片的代码(这工作):

let request = NSMutableURLRequest(URL: NSURL(string: self.submitLink)!) 
    let session = NSURLSession.sharedSession() 
    let params = [ 
     "article": [ 
      "name" : name, 
      "description" : fullDescription.text!, 
      "subdescription" : sDescription, 
      "category_id" : categoriesArray[self.categoryPicked]["id"] as! Int, 
      "location_id" : locationsArray[self.locationPicked]["id"] as! Int, 
      "Xcoordinate" : self.lat, 
      "Ycoordinate" : self.lng, 
      "user_id" : User.sharedInstance.userId, 
      "article_images_attributes[][image]" : "" 
     ] 
    ] 

    request.HTTPBody = try? NSJSONSerialization.dataWithJSONObject(params, options: NSJSONWritingOptions()) 
    request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
    request.addValue("application/json", forHTTPHeaderField: "Accept") 
    request.HTTPMethod = "POST" 

    let task = session.dataTaskWithRequest(request, completionHandler: { data, response, error -> Void in 
     print("article created.") 
    }) 

    task.resume() 

,这是我用此刻的代码(不工作):

let params = [ 
     "article[name]" : name, 
     "article[description]" : fullDescription.text!, 
     "article[subdescription]" : sDescription, 
     "article[category_id]" : categoriesArray[self.categoryPicked]["id"] as! Int, 
     "article[location_id]" : locationsArray[self.locationPicked]["id"] as! Int, 
     "article[Xcoordinate]" : self.lat, 
     "article[Ycoordinate]" : self.lng, 
     "article[user_id]" : User.sharedInstance.userId 
    ] 

    let boundaryConstant = "----------V2ymHFg03ehbqgZCaKO6jy" 
    let fileParamConstant = "article[article_images_attributes][][image]" 
    let session = NSURLSession.sharedSession() 
    let request = NSMutableURLRequest(URL: NSURL(string: self.submitLink)!) 

    request.HTTPMethod = "POST" 

    let contentType = "multipart/form-data; boundary=\(boundaryConstant)" 

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

    let body = NSMutableData() 
    for param in params { 
     print(param) 
     body.appendData("--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
     body.appendData("Content-Disposition: form-data; \(param.key)=\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
     body.appendData("\(param.value)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
    } 

    let imageData = UIImageJPEGRepresentation(self.photoArray[0], 1) 
    if imageData != nil { 
     body.appendData("--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
     body.appendData("Content-Disposition: form-data; name=\(fileParamConstant); filename=\"image.jpg\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
     body.appendData("Content-Type: application/octet-stream\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
     body.appendData(imageData!) 
     body.appendData("\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
    } 
    body.appendData("--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 

    request.HTTPBody = body 

    let task = session.dataTaskWithRequest(request, completionHandler: { data, response, error -> Void in 
     print(request) 
     print(data) 
    }) 

    task.resume() 

每当我试图提交我的形式服务器回复:

NoMethodError(未定义的方法'名称”的零:NilClass)

所以我认为有什么问题,我定义我的PARAMS的方式吗?有人可以更深入地向我解释一下,所以我知道我做错了什么?

+0

服务器与所述消息回复?你有没有使用像Charles或Wireshark这样的http代理来调查发送的内容? –

回答

0

看起来你使用了错误的Content-Type为您的形象和name可能不正确。

尝试这样的事情来设置你的形象:

NSMutableData *body = [NSMutableData data]; 
double compressionRatio=0.7; 
NSData* imageData = UIImageJPEGRepresentation((UIImage*)dataParam, compressionRatio); 

[self utfAppendBody:body data:[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\".jpg\"\r\n", paramName]]; 

[self utfAppendBody:body data:@"Content-Type: image/jpeg\r\n\r\n"]; 
[body appendData:imageData]; 

有了这个辅助函数:

- (void)utfAppendBody:(NSMutableData *)body data:(NSString *)data { 
    [body appendData:[data dataUsingEncoding:NSUTF8StringEncoding]]; 
}