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

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);

// 后续上传流程同上述代码

关键修正点

  1. 移除data URI的封装,直接使用图片二进制数据上传,符合接口参数要求
  2. 修复未定义变量$mediaIdAry的错误,改为使用返回的$mediaId对象
  3. 单个媒体ID无需使用implode,直接传入字符串即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 18:40:32