AFNetworking:从文件发送图像

Posted

技术标签:

【中文标题】AFNetworking:从文件发送图像【英文标题】:AFNetworking: Send image from file 【发布时间】:2014-10-14 09:37:49 【问题描述】:

我正在尝试发送包含图片的多部分发布请求。以下代码工作正常:

 manager.POST( apiUrl + "/location/add",
        parameters: parameters,
        constructingBodyWithBlock:  (formData : AFMultipartFormData!) -> Void in
          //  formData.appendPartWithFileURL(NSURL(string: location.imagePath!), name: "image", error: nil),
            formData.appendPartWithFileData(img, name: imgParam, fileName: "randomimagename.jpg", mimeType: "image/jpeg"),
        success:  (operation: AFHTTPRequestOperation!,responseObject: AnyObject!) in
            println("JSON: " + responseObject.description)
            var dict = responseObject as NSDictionary
            let json = JSONValue(dict)

            var message = ""
            if let msg = json["message"].string message = msg
            var success = false
            if let s = json["success"].bool 
                callback(success: success, msg: message)
            
        ,
        failure:  (operation: AFHTTPRequestOperation!,error: NSError!) in
            println("Error: " + error.localizedDescription)
            var apiError = ApiError()
            apiError.noConnection = true
            errorCallback(apiError: apiError)
    )

我想使用appendPartWithFileURL 而不是appendPartWithFileData。如果我用上面代码中注释掉的行替换第 5 行,我会收到以下编译器错误:

Extra argument 'constructingBodyWithBlock' in call

有人知道怎么解决吗?


编辑:找到了一个(非常、非常、非常奇怪的)解决方案。换行

formData.appendPartWithFileURL(NSURL(string: location.imagePath!), name: "image", error: nil),

var temp = formData.appendPartWithFileURL(NSURL(string: location.imagePath!), name: "image", error: nil),

除了添加var temp =,我没有做任何更改。我不知道为什么这有效,但确实有效。似乎是一个奇怪的错误。

【问题讨论】:

您好,您找到解决方案了吗? @Tarsem 抱歉,我不再研究这个问题,而是使用了 appendPartWithFileData。 @Tarsem:查看我的最新编辑 【参考方案1】:

如果您还没有解决这个问题,请尝试将 location.imagePath 转换为 String。

在以下代码中添加as String 之前,我遇到了同样的问题:

func uploadFile(file: NSData, url: String, formData: NSDictionary, parameters: NSDictionary, completion: AnyObject -> Void, failure: NSError -> Void) 
    operationManager.requestSerializer = AFJSONRequestSerializer() as AFHTTPRequestSerializer

    if operationManager.reachabilityManager.networkReachabilityStatus != .NotReachable 
        operationManager.POST(url, parameters: parameters, constructingBodyWithBlock:  (data) in
            data.appendPartWithFileData(file, name: formData["fileName"] as String, fileName: formData["fileName"] as String, mimeType: formData["mimeType"] as String)
        , success:  (operation, responseObject) in
            completion(responseObject)
        , failure:  (operation, error) in
            failure(error)
        )
     else 
        showReachabilityAlert()
    

希望对你有帮助。

【讨论】:

【参考方案2】:

在将 URL 转换为字符串之前,我一直收到此错误。这是我正在做的事情(并在这样做时收到错误):

let manager = AFHTTPSessionManager()
let fullUrl = NSURL(string: name, relativeToURL: NSURL(string: apiBaseEndpoint))

manager.POST(fullUrl, parameters: nil, constructingBodyWithBlock:  (formData) in
    formData.appendPartWithFormData(file, name: "image")
, success:  (operation, responseObject) in
    NSLog("hit success")
, failure:  (operation, error) in
    NSLog("hit the error")
)

为了解决这个问题,我只是通过添加.absoluteStringfullUrl 的分配改为使用字符串而不是NSURL

let fullUrl = NSURL(string: name, relativeToURL: NSURL(string: apiBaseEndpoint)).absoluteString

【讨论】:

以上是关于AFNetworking:从文件发送图像的主要内容,如果未能解决你的问题,请参考以下文章

AFNetworking 与 iOS 4.3 不兼容

afnetworking 多文件上传

使用AFnetworking以多部分格式上传图像在ios中不起作用

使用 AFNetworking 发送图像和其他参数

AFNetworking - 向 REST 发送 HTTP POST,发送带有 Base64string 图像的 JSON

使用 AFNetworking 上传图像