上传图像和文本值到服务器



我正在尝试使用multipart创建一个带有图像和其他一些值的新对象,但我无法让它工作。

这是我在没有上传图像的情况下使用的代码(这个有效):

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)rn".dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData("Content-Disposition: form-data; (param.key)=rnrn".dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData("(param.value)rn".dataUsingEncoding(NSUTF8StringEncoding)!)
    }
    let imageData = UIImageJPEGRepresentation(self.photoArray[0], 1)
    if imageData != nil {
        body.appendData("--(boundaryConstant)rn".dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData("Content-Disposition: form-data; name=(fileParamConstant); filename="image.jpg"rn".dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData("Content-Type: application/octet-streamrnrn".dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData(imageData!)
        body.appendData("rn".dataUsingEncoding(NSUTF8StringEncoding)!)
    }
    body.appendData("--(boundaryConstant)rn".dataUsingEncoding(NSUTF8StringEncoding)!)
    request.HTTPBody = body
    let task = session.dataTaskWithRequest(request, completionHandler: { data, response, error -> Void in
        print(request)
        print(data)
    })
    task.resume()

每当我尝试提交表单时,服务器都会回复:

NoMethodError(未定义的方法' name'为nil:NilClass)

所以我假设我定义参数的方式有问题?有没有人能更深入地给我解释一下,让我知道我做错了什么?

看起来您正在使用错误的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"rn", paramName]];
[self utfAppendBody:body data:@"Content-Type: image/jpegrnrn"];
[body appendData:imageData];

使用这个辅助函数:

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

最新更新