Загрузка файла IMGUR через PHP и cURL

Я пытаюсь загрузить изображение в 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? Спасибо, Боб


person Michael    schedule 12.04.2011    source источник
comment
Это означает, что PHP не может найти «image.jpg» и поэтому не может его открыть. Если файл изображения находится не в том же каталоге, что и этот скрипт, вам нужно будет указать путь, указывающий на изображение. Либо абсолютный путь (/path/to/image), либо путь относительно скрипта (../../elsewhere/image.jpg).   -  person Marc B    schedule 12.04.2011


Ответы (2)


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

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

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

person Ryan Matthews    schedule 12.04.2011
comment
Я не понимаю, откуда взялся image.jpg. Насколько я понимаю, PHP генерирует его из строки base64, которую я отправляю, а затем помещаю ее в папку, в которой находится файл PHP, верно? - person Michael; 12.04.2011
comment
Хорошо, я думаю, что нашел это. Просто нужно было удалить эту часть: $filename = "image.jpg"; $handle = fopen($filename, "r"); $data = fread($handle, filesize($filename)); Но тут еще вопрос открытый - как мне получить обратный звонок или ответ от IMGUR с указанием пути к загруженному изображению? - person Michael; 13.04.2011
comment
Я использую Actionscript 3 (AS3) с PHP для загрузки изображения. Я взял это из примеров IMGUR, но он возвращает пустое значение: var iresponse:XML = new XML(unescape(loader.data)); Есть идеи? - person Michael; 13.04.2011
comment
Как я могу отправить ответ с PHP на Flash? - person Michael; 14.04.2011
comment
все, что вам нужно сделать, это вывести xml, и flash должен его получить. Хотя я не слишком много знаю о флеше. Если все прошло хорошо, вы сможете протестировать только php-скрипт и вывести xml в браузере, чтобы увидеть исходный код возврата. - person Ryan Matthews; 14.04.2011
comment
Это работает, спасибо. Но выдает ошибку, что изображение повреждено. Я передаю из FLASH строку данных base64, как указано в документации. Подходит ли этот PHP-код для этого? pastebin.com/r6ZJcBn8 - person Michael; 14.04.2011
comment
API говорит, что вы также можете загрузить двоичный файл, вы можете попробовать это решение. Это URL-адрес, по которому я получаю информацию от dtbaker.com.au/random-bits/ ваша переменная $post_array будет включать image=› и key=› - person Ryan Matthews; 14.04.2011
comment
Не помогает. Я отправляю данные в кодировке base64 в PHP - так мне нужно удалить часть base64_encode внутри PHP, потому что она уже закодирована? вот код: + pastebin.com/r6ZJcBn8 - person Michael; 15.04.2011
comment
Если вы отправляете ему данные изображения, уже закодированные base64_encoded, вам придется удалить эту часть, потому что она уже закодирована. - person Ryan Matthews; 15.04.2011

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

$filename = "image.jpg";

To:

$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);
    }
?>
person grepsedawk    schedule 30.01.2013