【问题标题】:Uploading image and text values to server将图像和文本值上传到服务器
【发布时间】:2015-10-01 14:28:58
【问题描述】:

我正在尝试使用 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)\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(nil:NilClass 的未定义方法“名称”)

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

【问题讨论】:

  • 服务器回复该消息?您是否使用过诸如 Charles 或 Wireshark 之类的 http 代理来调查发送的内容?

标签: ios image swift multipartform-data nsurlsession


【解决方案1】:

您的图片似乎使用了错误的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]];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-26
    • 2016-06-06
    • 2013-08-13
    • 2017-06-22
    • 2013-12-17
    • 2014-03-21
    • 2017-05-31
    相关资源
    最近更新 更多