转换后的 Base64String 无法上传到 IMGUR API
Converted Base64String Fails to Upload to IMGUR API
语言: Swift
目标操作系统: MacOS
我需要将图像编码为 base64 字符串,然后使用 IMGUR api 使用 http post 请求将其上传为 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()
}
看来我构造的正文不正确。以下是如何执行此操作的正确解决方案。我密切关注 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()
}
语言: Swift
目标操作系统: MacOS
我需要将图像编码为 base64 字符串,然后使用 IMGUR api 使用 http post 请求将其上传为 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()
}
看来我构造的正文不正确。以下是如何执行此操作的正确解决方案。我密切关注 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()
}