You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Alamofire上传图片时应用崩溃问题求助

解决Alamofire上传图片时的崩溃问题

嘿,这个崩溃我之前踩过坑!咱们先拆解下错误信息:

-[__NSCFNumber dataUsingEncoding:]: unrecognized selector sent to instance 0xb000000000000013

这个错误的核心原因很明确:你在构建Alamofire的上传请求时,不小心把一个数字类型(比如Int/NSNumber)的值当成了需要编码成Data的字符串类型来传递。Alamofire试图对这个数字调用dataUsingEncoding:方法(这是字符串类专属的方法),但数字根本没有这个方法,直接就触发崩溃了。

常见的错误代码示例

大概率你写了类似这样的代码:

Alamofire.upload(multipartFormData: { multipartFormData in
    // ❌ 错误:直接把数字传进append方法
    multipartFormData.append(123, withName: "user_id")
    // 图片上传的部分可能是对的,但数字字段这里出问题了
    if let imageData = UIImageJPEGRepresentation(yourImage, 0.8) {
        multipartFormData.append(imageData, withName: "avatar", fileName: "avatar.jpg", mimeType: "image/jpeg")
    }
}, to: "your_upload_url")

正确的解决方法

对于表单里的数字字段,必须先转换成字符串,再传递给Alamofire的append方法,这里有两种简洁的写法:

Alamofire.upload(multipartFormData: { multipartFormData in
    let userId = 123 // 你的数字参数
    
    // 方法1:转成字符串后直接append(推荐,更简洁)
    multipartFormData.append("\(userId)", withName: "user_id")
    
    // 方法2:先转成Data再append(和图片上传的逻辑保持一致)
    if let userIdData = "\(userId)".data(using: .utf8) {
        multipartFormData.append(userIdData, withName: "user_id")
    }
    
    // 图片上传的正确写法(保留即可)
    if let imageData = UIImageJPEGRepresentation(yourImage, 0.8) {
        multipartFormData.append(imageData, withName: "avatar", fileName: "avatar.jpg", mimeType: "image/jpeg")
    }
}, to: "your_upload_url") { encodingResult in
    switch encodingResult {
    case .success(let upload, _, _):
        upload.responseJSON { response in
            // 处理你的上传响应
        }
    case .failure(let encodingError):
        print("编码失败:\(encodingError)")
    }
}

总结一下

本质就是不要直接把数字类型的值传给需要Data或String的append方法,一定要先转换成字符串类型。这样Alamofire就会调用字符串的编码方法,而不会去折腾数字,崩溃自然就解决了~

内容的提问来源于stack exchange,提问作者pankaj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:09:51