即使 url 有效,使用 imgur api 获取损坏的图像

Posted

技术标签:

【中文标题】即使 url 有效,使用 imgur api 获取损坏的图像【英文标题】:getting broken images using imgur api even though url works 【发布时间】:2017-10-09 18:38:08 【问题描述】:

这是我的代码,我正在使用 imgur api 上传图像并通过我的表单将它们显示在网页上。而不是显示实际图像,只显示损坏的页面图标,如果我将损坏的图像复制到 word 或记事本中,则显示实际图像。显然,图像存在,如果我将其复制到 word 或记事本中,它就是正确的路径。此外,我很确定 api 可以正常工作,因为保存在我的数据库中的 imgur url 可以正常工作并显示图像。有什么遗漏或者我应该像显示图像的方式一样改变吗?

if (isset($_POST['post'])) 
    if ($_FILES['postimg']['size'] == 0) 
        $postbody = $_POST['postbody'];
        $loggedInUserId = check::isLoggedIn();
        if (strlen($postbody) > 160 || strlen($postbody) < 1) 
            die('Incorrect length!');
        

        connect::query('INSERT INTO dry_posts VALUES (null, :postbody, NOW(), 0,:postimg)', array(':postbody' => $postbody));

        // Post::createPost($_POST['postbody']);

     else 

        $url = 'https://api.imgur.com/3/image'; // API endpoints, info: https://api.imgur.com/endpoints/image#image-upload
        $client_id = ''; // Get client_id here: https://api.imgur.com/#registerapp

        $fh = fopen($_FILES['postimg']['tmp_name'], 'r');
        $read = fread($fh, $_FILES['postimg']['size']);
        fclose($fh);
        $post = array(
            'image' => base64_encode($read)
        );
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Authorization: Client-ID '.$client_id
        ));
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $json = curl_exec($ch); // Response, info: https://api.imgur.com/#responses
        curl_close($ch);
        // $image = json_decode($json, true); // Array
        $image = json_decode($json); // Object
        // var_dump($image);
        //$postimg = $image['data']['link']; // Array-style
        $postimg = $image - > data - > link; // Object-style

        connect::query('INSERT INTO dry_posts VALUES (null, \'\', NOW(), 0, :postimg)', array(':postimg' => $postimg));

    



$dbposts = connect::query('SELECT * FROM dry_posts ORDER BY id DESC');
$posts = "";
//here's how I display the images/posts 
foreach($dbposts as $p) 
    if (!connect::query('SELECT post_id FROM post_likes WHERE post_id=:postid', array(':postid' => $p['id']))) 
        $posts. = "<img src='".$p['postimg'].
        "'>".htmlspecialchars($p['body']).
        " <
        form action = 'try.php?postid=".$p['
        id ']."'
        method = 'post' >
            <
            input type = 'submit'
        name = 'like'
        value = 'Like' >
            <
            span > ".$p['likes']."
        likes < /span> <
            /form> <
            hr / > < /br / >
            ";

     else 
        $posts. = "<img src='".$p['postimg'].
        "'>".htmlspecialchars($p['body']).
        " <
        form action = 'try.php?postid=".$p['
        id ']."'
        method = 'post' >
            <
            input type = 'submit'
        name = 'unlike'
        value = 'Unlike' >
            <
            span > ".$p['likes']."
        likes < /span> <
            /form> <
            hr / > < /br / >
            ";
    

这是表格

<form action="try.php" class = "forum" method="post" enctype="multipart/form-data">
        <textarea name="postbody" rows="4" cols="60" class = "text"></textarea>
         <br />Upload an image:
        <input type="file" name="postimg">
        <input type="submit" name="post" value="Post">
        <input type="submit" value="Upload">
</form>

<div class="posts">
        <?php echo $posts; ?>
</div>

【问题讨论】:

您能否提供一个示例“损坏”图片网址? 奇怪的是图像刚刚开始显示但我没有更改我的代码我确实清除了缓存但是当我这样做时它并没有立即改变 【参考方案1】:

我认为这称为anonymous use of the API,因此所有上传的图片都是匿名共享的,不会附加到您的帐户。

为了将图片上传到您的私人帐户,您可能需要获取 Access Token,并使用Bearer 身份验证。

【讨论】:

以上是关于即使 url 有效,使用 imgur api 获取损坏的图像的主要内容,如果未能解决你的问题,请参考以下文章

使用 imgur api v3 使用 php 匿名上传图片

在 Jest 单元测试中模拟 imgur API 调用

cURL 请求从 imgur api 获得 NULL 响应

获取请求适用于邮递员,但适用于浏览器

获取 Alexa 数据 [关闭]

如何解决调用 Amazon SP-API 的问题,该 API 始终返回未经授权,即使使用有效的令牌和签名也是如此