API返回带有Guzzle的PNG图像


API return PNG image with Guzzle

我正在向Box.com发送一个API请求,以获取PNG图像的缩略图。我在用拉拉威尔。当我使用以下代码时,我得到了要转换PNG图像的原始字符串数据。

$client = new Client('https://api.box.com/{version}/files/{file_id}', [
            'version' => '2.0',
            'file_id' => $id,
            'request.options' => [
                'headers' => [
                    'Authorization' => 'Bearer ' . self::getAccessToken(),
                ]
            ]
        ]);
        $request = $client->get('thumbnail.png?min_height=256&min_width=256');
        try {
            $response = $request->send();
            dd($response->getBody(true));

在不返回getBody()方法字符串的情况下,我什么都得不到,因为Box.com将在正文中返回缩略图的内容。

下面是我得到的字符串示例:

b"""
‰PNG'r'n
'x1A'n
'x00'x00'x00'rIHDR'x00'x00'x01'x00'x00'x00'x01'x00'x08'x06'x00'x00'x00'r¨f'x00'x00'x00'x06bKGD'x00ÿ'x00ÿ'x00ÿ ½§“'x00'x00'x00'tpHYs'x00'x00'x00H'x00'x00'x00H'x00FÉk>'x00'x00'x00'tvpAg'x00'x00'x01'x00'x00'x00'x01'x00'x00²gÜŠ'x00'x00€'x00IDATxÚÌýiŒ-[–߇ýö'x14Ã9™y3ï}ᄅޫªî®êê2%Ñ$[à 'x19¶!Y&)'x1A”iC'x10`Ø0'x04I¶õÙ'x06,'x7F0­'x0F$a›0!Û0M‘¢'x04'x0E¦Dv³'x075ÙÕC©ç¡º»z¨ù½'x1AÞ|ç'x1CΉˆ=ùÃÚ'x11'ÎÉ“Ã}]2'x1C'x0Fùnæ'x19"vìØkí5ü×'x7F©Óó''x19@)…RŠ˜'x13™ù‘Ñãoy眧ïí;²|ˆë'x0FÅö'x05óôÿ4~B©­qÌ?¹ýÕŒš>¿ÿÈ{Æ£”"ç<½7~'x7F¼¿Ý×wÏ“sFk½ýZÊ 'x00'x12ÞwXcpÎñcÿäGøíßü5BPüþ—¾Ž±†'x14#'x19è;O×]'x00‰¾_ã½/3¤dš²"gEŒ'x11¥ÔtÍÍØ˳ș'x10#Zk¬5[ã'x1AŸWJ2»Z),š@ÆÇPÆž¶î{3G't­'r0*•ëRÖÆZGJi'x1A_y'x13­'x15ÖT'fÞ“‰h5Η¡ª'x1CÚ'x18'x19óà‰1¢†'fYAUUÔuÍ0'f[ÏDk1'x1Ac'x1C9'B'x08TUÅb± gMí'x0Eù÷þÝÿ€ÿî'x7Fï_áÃ'ï¡ŒA;M&SåŒÒzöüT¹Ç²'UùㆵôÿoÇî3»êÏÈ<Úýg‚'x14eRµ ÕÖE'x00RJ{'x05cç4Üb8EP惓Co^$“IYm>ªæ'x0F-ï'x15ÎÛ>¼}“6'n
Õü~÷)»ËBRþVY'x16f'x1CÐ'x1A'x1E<xÈ_ùË'x7F™EÓÒwkÖë'x18#'x17'x17ç'x18c'x08>'x12Ä'x18I)'x10cœÎ•'x15¨œ'x01CJyKè'eE'x16¥“5Z+Œ¶“ ŒB©õ¶'n
•û1„''x16~Ö@Þ{¯£°§,Š8'x15Á×J¡´"%EŒ‰œå»:Éx´QXeE¦væ'x162!'x04'x08ÊU4ÖÑ…'x04Q'x06'x14É'f'fh­EÉ”9Ù܇(¥ñ'x08Á³^­iÛ'x03ž>{Äßø›ÿ1_{ó+üÅÿÉÿ”>'U¶Š”'x1Dz6wj:›h€<{Äó¹Ø}Ö7­¥›>£§g÷9n'x12þ}r2Wƒä”ÉãDŒS¢.'vÿøûø`æ'vr÷çºÁlÞß'x7Fù¡Pä4'x1A'x14£ÕPVnÙùwÏ?*©ÛŒgßw÷Ýëí'x1F@"'x13'x08¡çøø˜¿ÿ÷ÿ.¿÷{¿‹ÖŽÓ§kúÁ£µ,ê¾ï'x19'x06Oˆ‘˜â´ÐSJò'x13#1&RÊh}yÞ)S!ceë}™¢Ë'x16€R'n
cŒì¶Jì-­äûƘÉJ˜Ïáø¤2²ãÇl'x08I'x11"(•€@Îò“ˆ$'x15‰9àCOïûÙcV['x16L'x08'x01¥ÀY+c'x18Ç]þ‹1N?ãx¼÷Ó=Ž–R'x08‘~è9;'x7FJU+'x1E?y‡ÿìïü'üÌg'x7F†E]ã»'x0E•6s²µ.ÆŸG<^c¾á]wÌç÷ÆÏd™z]~H'x19•òô÷üGM?Yþ¥<¶2WE;_«M6ãß|È&5'x7F°y:±Ñ'n
ãì¥'t™Ÿì;e'x1EM¦×l‚.'v'x14h}…rØ£¡çç¹Í1í¶;nÍüïq'x11ì;¯ì'x142“!'x052"Ø'GGü½¿÷Ÿó³?û9¾÷{¿Ÿ'x0F'x1F< ÷žÞwX+'x06X'x08'x1E­'fÞ'x0FÄ'x14'x10‹xŸÂºäô'žƒ¸3æÙï£ÐUUEJi'x12<Hh£ÐFîËÚ†¾ï'ÛwŒ»°Œ(ô'x13Ï,'x08-®KR't2h¥‘Ó)òÌÚ'x00è‡'x01¯'x03É(bH"ú9@L$£Š|¦òyKJ‰aÐ8[Íž]$„HΉõúŒÃ£CŽ'x0F'x0Fù+'x7FåÿÈK¯üUþù'x7Fñ¿Åã'OX.Ýf:)›Ëöln­Ÿ«'¿ùßÛ›ã~Ï÷*ËtRæ)m¹&›‘Ì­§2ð'x1D·y|?å<½µ»aoddöúÓ‹Çy'À(…¾”§›È»'x03Þ½»¼{C›kŒ'x0Fø*Óyòcaï.~ÝuPÛ'x13z'e'x05°ï3û'x1Eêh2ßÖ¯Úún'n
taÍÑbÉÃ'x07ïóïü;ÿK'x16Í]@'x11c “ñƒ‡œéûž¾'x1Fd×Lž'x10â4®4w'x03r"cQJO×'x11Aß'×'x1A‡RfÚ±Æç Ôæ>1Ôuµ–õz'rdb'x1CPJÏ”Ž™¬¹5tµ'v”PjÛ]J)cŒÞ|''e(f<ˆ•1~?¥´eam”N'x002ιò¹éœÉ8SSW'vbô(•È$BJhmq®¢®'x174®Á'x0Fž”áoüÍ¿Å'v/Üålý”¦YÈwrBa‹BS›e¦Š'x1D|źÝ]só¿s¾z³š'x1Fzwy“E'x19Í]»'rgW!_z'x1ElÄä*¹Ø'x1AÃÎÝMÚcnY>'x00Ì'x17çü{»æøü³J)2Š´õ³çØØA“ðß4Žç'x19óüßçµnæ÷–RÂ'x02Ýê”ÿè/ý%â ‹»ëÖ¬V+Ö«5Cß³Z­'x08!L®À'èÈ'x19=úØåÖ·'x03•'x1A¥2"$QLp'x15ÑF¡t&'x13G'eqúŽµ'x16k'r©ëŠ¶mpÎaŒ#¥LUÕhm&!ݧ,÷í†9³ež‹{¡ËwÆu´'x11à]·qsÂm×M''x05MŒ©Ä'x17Ƶ‚'x04'x0EÕÜòbº×'x18Å'x12'x18úu·¢®'x1DëÕ'x05ÿç¿úWyvzŠVfR®JAVâjŒëJ+0*£È¨œP)A”ŸÑ'x1CÏyg=çòy'x10{b'fHÏ~¶ærßòÞ±<ækr'x1Eó¹ÊÍÈ;nëÍk¸Ä'x00òü'v{LÏ­‹ßF'x1AJ`nôÓ®'vœMç'x1Fýݙ߹{ì¾~'eÿþºÏìúúû”ÓíŽmí'x1F'x06ÏñCþÊ_ù?ñæW¿ÆA}‡¾ëI)•'x1D¿g'x18'x06Bð'fÃÀ0øiל+J¥ÔF‚Ô¾lÉÆnR'n
RÊ[Šd¾«j­‹°'eŒ1²àË÷mp¶Áššº^Hl`Çú'x19M~­õôžµ¶ü¾]PJQUM±Fdg'x7Fn' WLãìy¥K'x01ÉyÌ#çqGTEð7ë'F't¤'x06ßs~q΋/ÞãÇ~ô'x1Fó'x0FÿÁ?äèè„uwQ'x02ŸvÚu·×Æ•ÃÛz'x06ã#Ú'x08½('x10ÚñáE™èœÐÈç2iKñl6¶¼y>;'eÞMY·<›Ã›â'x169ƒV%'x12¨•BoìÅí%¶'ò'x7F­8Ì'x16Ý8˜]­µ+˜i.|W(šÍw/¿öQŽ}©¿yŠlþÞüõKãʱ<#Mß_prÒð'x13?úÃüê/'x7Fžû/½N7x'x06?L»d'x08Pv©'x10'x02>xB'f¨Ùœ¥Q9•hù|wÜÝiE'x10M'x11‚0'tÿ˜'x01'x18?'eBÀûHJ'n
"""

我得到了图像作为唯一字符串值的成功响应

$response = $this->client->request('GET', '/ap/generate-example/qr/image', [
                'headers' => [
                    'Content-Type' => 'application/json',
                    'user_name' => 'user_name',
                    'password' => 'password',
                    'Authorization' => "Bearer assdadga",
                    'width' => '300',
                    'height' => '300',
                    'imgtype' => 'jpg'
                ],
                // 'sink' => '/uploads/images'
            ]);
$body = $response->getBody();
$base64 = base64_encode($body);
$mime = "image/jpeg";
$img = ('data:' . $mime . ';base64,' . $base64);
dd($img);

输出:data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCADcANwBAREA/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaE

让我们一起来看<img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQA" />

我自己已经在Laravel 5.1上使用Guzzle3解决了这个问题。以下是相关代码,我希望您将来会发现它有帮助:

在你的模型中,或者如果你更喜欢使用控制器,那么它很好:

/**
 * Get download link from Box.com
 *
 * @param $id
 * @return bool|int|string
 */
public static function getDownloadLink($id)
{
    $client = new Client('https://api.box.com/{version}/files/{file_id}', [
        'version' => '2.0',
        'file_id' => $id,
        'request.options' => [
            'headers' => [
                'Authorization' => 'Bearer ' . self::getAccessToken(),
            ]
        ]
    ]);
    $request = $client->get('content');
    try {
        $response = $request->send();
        $result = $response->getEffectiveUrl();
    } catch (BadResponseException $e) {
        $result = $e->getResponse()->getStatusCode();
        if ($result === 401) {
            self::regenerateAccessToken();
            return self::getDownloadLink($id);
        }
    }
    return count($result) ? $result : false;
}

在上面的静态方法中,我向Box.com API发送了一个GET请求,API返回effectiveUrl,这是我们正在寻找的直接下载文件链接。