PHP中使用data:image/jpeg;base64发推特报错求助
问题:PHP中使用base64格式图片发布推特失败
需求
在PHP中使用data:image/jpeg;base64格式的图片发布推特。
当前代码
$originImg = "/var/www/a.jpg"; function testFunc($param){ $im = new Imagick($param); $result = 'data:image/jpeg;base64,' . base64_encode($im->current()); $im->destroy(); return $result; } $testFuncReturn = testFunc($originImg); require '../../composer/vendor/autoload.php'; use Abraham\TwitterOAuth\TwitterOAuth; $connection = new TwitterOAuth(API_KEY, API_SECRET, ACCESS_TOKEN, ACCESS_SECRET); $mediaId = $connection->upload('media/upload', ['media' => $testFuncReturn]); $mediaIdString = $mediaIdAry->media_id_string; $parameters = [ 'status' => 'hogetext', 'media_ids' => implode(',', $mediaIdString) ]; $result = $connection->post('statuses/update', $parameters); if( $connection->getLastHttpCode() == 200 ){ echo "success"; } else { echo "fail"; }
已尝试的修改
// $result = base64_encode($im->current()); // $result = $im->current(); // $result = 'data:image/jpeg;base64,' . $im->current(); // $result = mime_content_type('data:image/jpeg;base64,' . base64_encode($im->current())); // $resultAry[0] = 'data:image/jpeg;base64,' . base64_encode($im->current()); // $resultAry[1] = mime_content_type('data:;base64,' . base64_encode($im->current())); // $mediaId = $connection->upload('media/upload', ['media' => $resultAry[0], 'media_type' => $resultAry[1]], true);
报错信息
InvalidArgumentException: You must supply a readable file
Warning: filesize(): stat failed for data:image/jpeg;base64,/9j/4AAQSkZJRgA
Warning: mime_content_type(/9j/4AAQSkZJRgA
环境
PHP 7.2.3,Twitter API 1.1
解决方案
错误原因
TwitterOAuth的media/upload接口不接受完整的data URI字符串,它仅支持原始二进制图片数据、本地文件路径或可读取的文件资源。你传入的data:image/jpeg;base64,...被当作文件路径解析,自然找不到对应文件,引发报错。
修正后的代码
$originImg = "/var/www/a.jpg"; // 调整函数,直接返回图片的二进制数据(无需封装为data URI) function testFunc($param){ $im = new Imagick($param); $result = $im->current(); // 获取原始JPG二进制内容 $im->destroy(); return $result; } $imageBinary = testFunc($originImg); require '../../composer/vendor/autoload.php'; use Abraham\TwitterOAuth\TwitterOAuth; $connection = new TwitterOAuth(API_KEY, API_SECRET, ACCESS_TOKEN, ACCESS_SECRET); // 传入二进制图片数据完成上传 $mediaId = $connection->upload('media/upload', ['media' => $imageBinary]); // 修复变量名错误,正确获取媒体ID字符串 $mediaIdString = $mediaId->media_id_string; $parameters = [ 'status' => 'hogetext', 'media_ids' => $mediaIdString // 单个媒体ID直接传入字符串即可 ]; $result = $connection->post('statuses/update', $parameters); if( $connection->getLastHttpCode() == 200 ){ echo "success"; } else { echo "fail"; }
额外说明(若已有data URI格式的字符串)
如果场景中只能拿到data URI格式的图片字符串,可先解码为二进制再上传:
// 假设已有data URI字符串 $testFuncReturn = testFunc($originImg); // 剥离data URI前缀,解码得到二进制数据 list(, $data) = explode(',', $testFuncReturn); $imageBinary = base64_decode($data); // 后续上传流程同上述代码
关键修正点
- 移除
data URI的封装,直接使用图片二进制数据上传,符合接口参数要求 - 修复未定义变量
$mediaIdAry的错误,改为使用返回的$mediaId对象 - 单个媒体ID无需使用
implode,直接传入字符串即可
内容的提问来源于stack exchange,提问作者user3474300
相关产品推荐
相关产品推荐

