使用Imgur API上传图片报错1003,同图Base64转换结果不一致问题
问题原因说明
1. Base64转换环节确实存在错误
你代码中的错误出在二进制文件读取环节,两个错误直接导致生成的Base64内容失真:
- 错误使用
QTextStream读取二进制图片:QTextStream是文本处理工具,会默认按系统文本编码解析二进制的图片数据,自动做编码转换,直接篡改了图片的原始二进制字节,读取到的内容从根源上就不是原图片的真实数据。 - 多余的
toUtf8()调用:即使正确读取到原始二进制字节,也不需要额外转Utf8编码,直接使用原始字节转Base64即可。
2. 同一张图片Base64值不一致的原因
官方给出的测试Base64字符串R0lGODlhAQABAIAAAAAAAP//yH5BAEAAAAALAAAABAAEAAAIBRAA7解码后是标准1x1像素GIF的原始二进制数据。你用QTextStream读取时,把原始二进制字节当成文本做了编码转换,转码后的字节已经和原图片字节完全不同,重新编码得到的Base64自然和官方值不一致。
Imgur接口解析上传内容时识别不到合法的图片文件头,就会返回File type invalid错误。
修复方案
将文件读取和Base64转换部分替换为直接读取二进制数据的逻辑即可:
QNetworkAccessManager *manager = new QNetworkAccessManager(this); QUrl url("https://api.imgur.com/3/image"); QNetworkRequest request(url); request.setRawHeader("Authorization", "Client-ID <hereIsTheClientID>"); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); QFile image ("C:/Users/pietr/Desktop/image.gif"); if (!image.open(QIODevice::ReadOnly)) { // 自定义文件打开失败的处理逻辑 return; } // 直接读取原始二进制数据,不使用QTextStream做文本转码 QByteArray rawImageData = image.readAll(); // 直接用原始二进制数据转Base64,不需要额外转Utf8 QByteArray imageArray = rawImageData.toBase64(); qDebug() << "Image data:" << imageArray; QUrlQuery params; params.addQueryItem("image", imageArray); connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*))); manager->post(request, params.query().toUtf8());
内容的提问来源于stack exchange,提问作者PietR26
相关产品推荐
相关产品推荐

