转换后的Base64String无法上传到IMGUR API

问题描述 投票:-2回答:1

语言:斯威夫特

TargetOS:MacOS

我需要将图像编码为base64string,并使用IM发送请求使用IMGUR的api将其上传为PNG。我有另一个功能,它截取屏幕截图并将其创建为CGImage对象。我使用了他们的api R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7中提供的base64string示例,这导致成功的200状态代码。不幸的是,用我的imageToBase64String()函数(下面)替换此字符串会导致错误415状态代码。我能够以HTML格式显示Base64图像字符串而不会出现任何问题。

将CGImage截图转换为Base64String的函数:

func imageToBase64String(_ cgImage: CGImage) -> String? {
    let imageRep = NSBitmapImageRep(cgImage: cgImage).representation(using: NSBitmapImageRep.FileType.png, properties: [:])
    let base64Image:String = ((imageRep!.base64EncodedString()))
    Logger.write(base64Image)
    return base64Image
}

这是imgur的匿名上传:

func anonymousUpload(_ image: CGImage){
    let base64Image = imageToBase64String(image)!

    // Using this works fine
    //let base64Image = "R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"

    let url = "https://api.imgur.com/3/upload"
    let request = NSMutableURLRequest(url: NSURL(string: url)! as URL)
    request.httpMethod = "POST"
    request.setValue("Client-ID \(imgurAPI.CLIENT_ID)", forHTTPHeaderField: "Authorization")
    let bodyString = "image=\(base64Image)&type=base64&title=sample&description=Desktop screenshot"
    request.httpBody = bodyString.data(using: .utf8)

    let task = URLSession.shared.dataTask(with: request as URLRequest){ data, response, error in
        if (error != nil){
            print("error: \(error)")
            return
        }
        print("response: \(response!)")
        let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
        print("response string: \(responseString!)")

    }
    task.resume()
}
swift image macos base64 imgur
1个回答
1
投票

看起来我构造的身体不正确。以下是如何做到这一点的正确解决方案。我密切关注Postmans生成的http代码来构建下面的请求:

func anonymousUpload(_ image: CGImage){

    // Convert the file to base64
    let base64Image:String = imageToBase64String(image)!

    // Create our url
    let url = URL(string: "https://api.imgur.com/3/image")!
    let request = NSMutableURLRequest.init(url: url)
    request.httpMethod = "POST"
    request.addValue("Client-ID " + imgurAPI.CLIENT_ID, forHTTPHeaderField: "Authorization")

    // Build our multiform and add our base64 image
    let boundary = NSUUID().uuidString
    request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
    let body = NSMutableData()
    body.append("--\(boundary)\r\n".data(using: .utf8)!)
    body.append("Content-Disposition: form-data; name=\"image\"\r\n\r\n".data(using: .utf8)!)
    body.append(base64Image.data(using: .utf8)!)
    body.append("\r\n".data(using: .utf8)!)
    body.append("--\(boundary)--\r\n".data(using: .utf8)!)
    request.httpBody = body as Data

    // Begin the session request
    let task = URLSession.shared.dataTask(with: request as URLRequest){ data, response, error in
        if (error != nil){
            print("error: \(error)")
            return
        }

        print("response: \(response!)")
        let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
        print("response string: \(responseString!)")

    }
    task.resume()
}
© www.soinside.com 2019 - 2024. All rights reserved.