Загрузка файла IMGUR через PHP и cURL - PullRequest
1 голос
/ 12 апреля 2011

Я пытаюсь загрузить изображение в IMGUR через PHP.Это код:

<?
$filename = "image.jpg";
$handle = fopen($filename, "r");
$data = fread($handle, filesize($filename));

// $data is file data
$pvars   = array('image' => base64_encode($data), 'mykey' => IMGUR_API_KEY);
$timeout = 30;
$curl    = curl_init();

curl_setopt($curl, CURLOPT_URL, 'http://api.imgur.com/2/upload.xml');
curl_setopt($curl, CURLOPT_TIMEOUT, $timeout);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $pvars);

$xml = curl_exec($curl);

curl_close ($curl);

?>

Это сообщение об ошибке, которое я получаю:

Предупреждение: не удалось открыть fopen (image.jpg)поток: нет такого файла или каталога

Я не понимаю часть: $ filename = "image.jpg";Откуда берется имя файла, так как это строка, сгенерированная base64?Спасибо, Боб

Ответы [ 2 ]

2 голосов
/ 12 апреля 2011

Это предупреждение связано с тем, что fopen пытается прочитать файл image.jpg из каталога, из которого выполняется ваш скрипт. Хороший пример того, как передать файл через curl, можно увидеть здесь

Отправить файл через cURL из формы POST в PHP

Где у них есть $ localFile = $ _FILES [$ fileKey] ['tmp_name']; вы бы поместили $ localFile = '/path/to/image.jpg'; А также измените информацию о сервере и добавьте любые другие переменные, которые вам, возможно, понадобится передать imgur.

0 голосов
/ 30 января 2013

Изменить строку 1 с:

$filename = "image.jpg";

На:

$filename = $_FILES['uploaded_file']['tmp_name'];

Затем, чтобы опубликовать ... Я рекомендую форму, подобную этой:

    <form enctype="multipart/form-data" method="post" action="upload.php" target="my_iframe">
    Choose your file here:
    <input name="uploaded_file" type="file"/>
    <input type="submit" value="Upload It"/>
    </form>
<!-- when the form is submitted, the server response will appear in this iframe -->
<script language="JavaScript">
<!--
function autoResize(id){
    var newheight;
    var newwidth;

    if(document.getElementById){
        newheight=document.getElementById(id).contentWindow.document .body.scrollHeight;
        newwidth=document.getElementById(id).contentWindow.document .body.scrollWidth;
    }

    document.getElementById(id).height= (newheight) + "px";
    document.getElementById(id).width= (newwidth) + "px";
}
//-->
</script>

<IFRAME name="my_iframe" width="100%" height="200px" id="iframe1" marginheight="0" frameborder="0" onLoad="autoResize('iframe1');"></iframe>

Если вы поместили весь свой php в upload.php, а затем разместили эту форму на странице в том же каталоге, это довольно близко к функциональности ... За исключением того, что в вашем источнике еще нет API_KEY.Вы можете получить API-ключ здесь: https://imgur.com/register/api_anon

В конце ваш PHP должен выглядеть так:

    <?
    if( isset($_FILES['uploaded_file']) )
{
    $IMGUR_API_KEY = 'u432ewriuq3oirefuie'; //put your api key here
    $filename = $_FILES['uploaded_file']['tmp_name'];
    $handle = fopen($filename, "r");
    $data = fread($handle, filesize($filename));

    //$data is file data
    $pvars   = array('image' => base64_encode($data), 'key' => $IMGUR_API_KEY);
    #$pvars   = array('key' => $IMGUR_API_KEY);
    $timeout = 30;
    $curl    = curl_init();

    curl_setopt($curl, CURLOPT_URL, 'http://api.imgur.com/2/upload.xml');
    #curl_setopt($curl, CURLOPT_URL, 'http://api.imgur.com/2/gallery.xml');
    curl_setopt($curl, CURLOPT_TIMEOUT, $timeout);
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $pvars);
    $xml = curl_exec($curl);
    $xmlsimple = new SimpleXMLElement($xml);
    echo '<img height="180" src="';
    echo $xmlsimple->links->original;
    echo '">';

    curl_close ($curl);
    }
?>
...