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

使用OAuth1Swift的postImage方法上传Flickr照片失败,报错No Photo Specified

解决Flickr API上传图片时"No Photo Specified"错误的方案

我来帮你排查这个Flickr上传图片的问题,你遇到的No Photo Specified错误(code 2),核心原因是上传请求的格式不符合Flickr API的要求,尤其是图片数据的提交字段和请求构造方式出了问题,下面一步步给你解决:

问题根源分析

  1. 图片字段不匹配:Flickr上传API要求图片必须作为名为photo的表单字段提交,而你使用的postImage方法可能默认把图片放在image字段,导致服务端识别不到图片数据。
  2. 参数处理不当:直接复用授权返回的parameters字典,没有构造上传所需的正确参数,同时缺少OAuth签名的自动处理,才会出现"No Token were provided"的错误。

修正后的代码实现

替换你原有的上传请求代码部分,改用multipartFormRequest来构造符合Flickr要求的请求:

case .success(let (credential, response, parameters)):
    print(credential.oauthToken)
    print(credential.oauthTokenSecret)
    
    guard let img = self.image?.jpegData(compressionQuality: 0.5) else { 
        print("无法转换图片") 
        return 
    }
    
    // 构造Flickr上传所需的基础参数
    let uploadParams: [String: String] = [
        "format": "json",
        "nojsoncallback": "1" // 让Flickr直接返回纯JSON,避免回调包裹
        // 可额外添加title、description等自定义参数
    ]
    
    // 使用multipart/form-data构造正确的上传请求
    self.oAuthSwift!.client.multipartFormRequest(
        url: flickr.uploadEndpoint,
        method: .POST,
        parameters: uploadParams,
        files: [MultipartFormData(
            name: "photo", // 必须是Flickr要求的字段名
            data: img,
            fileName: "uploaded_photo.jpg",
            mimeType: "image/jpeg"
        )],
        encodingCompletion: { encodingResult in
            switch encodingResult {
            case .success(let request, _, _):
                // 发送请求并处理响应
                let task = URLSession.shared.dataTask(with: request) { data, response, error in
                    DispatchQueue.main.async {
                        if let error = error {
                            print("上传失败:\(error.localizedDescription)")
                            return
                        }
                        
                        guard let data = data else {
                            print("无返回数据")
                            return
                        }
                        
                        if let responseString = String(data: data, encoding: .utf8) {
                            print("\nRESULT:\n - \(responseString)\n")
                        }
                        
                        // 可选:解析JSON响应
                        if let json = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
                            print("JSON响应:\(json)")
                        }
                    }
                }
                task.resume()
                
            case .failure(let error):
                print("请求构造失败:\(error.localizedDescription)")
            }
        }
    )

额外注意事项

  • 确认上传端点:确保flickr.uploadEndpoint是https://up.flickr.com/services/upload/(注意是up.flickr.com,不是www.flickr.com)
  • 图片数据有效性:避免用compressionQuality: 0.0压缩图片,过低压缩率可能导致图片损坏,建议用0.5~0.8的压缩率测试
  • 应用权限检查:在Flickr开发者后台确认你的应用已经开启了上传权限,否则会出现权限相关错误

为什么原代码不行?

OAuthSwift的postImage方法默认将图片放在image字段,而Flickr严格要求图片字段名为photo,这就是服务端返回"No Photo Specified"的直接原因;而自行构造请求时,你没有正确携带OAuth签名所需的所有参数(如oauth_nonce、oauth_timestamp、oauth_signature等),才会触发"No Token were provided"错误,使用oAuthSwift!.client的方法会自动处理这些签名逻辑,更可靠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:14:49