Класс PHP Curl не будет загружать файл прямо из переменной, где подвох? - PullRequest
0 голосов
/ 15 сентября 2010

Я пытался придумать скрипт, использующий библиотеку GD, чтобы создать изображение и загрузить его прямо в ImageShack, используя их API. Я использую класс ImageShack, написанный Эллиоттом С. Бэк, который безупречно работает, загружая изображение из файла. Но когда я пытаюсь изменить одну простую строку кода опций CURL, он ломается и не загружается.

Я написал пример кода, который просто создает черное изображение, сохраняет его в переменной (а также пытается сохранить его в локальном файле - чтобы убедиться, что он не будет поврежден, сохраняя его в переменной или чем-то еще), и наконец пытается загрузить в ImageShack. Код комментируется, поэтому его должно быть довольно легко читать. Я надеюсь, что вы сможете помочь мне с этим, так как я уже попробовал все, что мог придумать. Можно ли даже загрузить файл с помощью CURL из переменной?

Когда я запускаю этот скрипт, я получаю кучу ошибок, но все они либо:

PHP Notice: Undefined offset: 1 in test.php on line 82

или

PHP Notice: Undefined offset: 2 in test.php on line 82

#!/usr/bin/php -q

<?php
// Create some basic image using PHP manual example for GD library
$img = imagecreatetruecolor(200, 200);

// Create new object from class ImageShack
$imageshack = new ImageShack;

// Store image to variable $image
ob_start();
ImagePNG($img);
$image = ob_get_clean();

// Upload image to ImageShack and print the url
$imageshack->upload($image);
$url = $imageshack->get_image_url();
print $url;

// And now let's try to save image from $image variable to local file to see if it's not corruped or anything
$tmpFile = "tmpFile.png";
$fh = fopen($tmpFile, 'w') or die("Can't open file");
fwrite($fh, $image);
fclose($fh);

// And finally destroy the image to free memory.
imagedestroy($img);

// Follows the slightly modified version of ImageShack class by Elliott C. Back
// only modified part is CURLOPT_POSTFIELDS part of upload() function and removed not required functions
// Class works flawlessly if you use it unmodified and upload from file, instead of variable.
class ImageShack
{
    var $is_url = "http://www.imageshack.us/index.php";
    var $is_result = false;
    var $is_result_parsed = false;

    public function upload( $file )
    {
        // send the image to ImageShack
        $ch = curl_init($this->is_url);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_TIMEOUT, 240);
        curl_setopt($ch, CURLOPT_POSTFIELDS, array( 'xml'=>'yes', 'fileupload'=>$file ));
  // curl_setopt($ch, CURLOPT_POSTFIELDS, array( 'xml'=>'yes', 'fileupload'=>'@'.$file )); <== This is original line
        curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Expect: ' ));
        $this->is_result = curl_exec($ch);
        curl_close($ch);

        // Parse the result
        $this->parse();
    }

    public function get_image_url()
    {
        return $this->get( "image_link" );
    }

    private function get( $key )
    {
        if( !$this->is_result_parsed )
            return false;

        return( $this->is_result_parsed[ $key ] );
    }

    private function parse()
    {
        if (strpos($this->is_result, '<'.'?xml version=”1.0? encoding="iso-8859-1??>') === false)
            $this->is_result_parsed = false;

        $xmlData = explode("\n",$this->is_result);
        $xmlr = array();

        foreach($xmlData as $xmlDatum){
            $xmlDatum = trim($xmlDatum);

            if($xmlDatum != "" && !eregi("links",$xmlDatum) && !eregi("xml",$xmlDatum)){
                $xmlDatum = str_replace(">","<",$xmlDatum);
                list($xmlNull,$xmlName,$xmlValue) = explode("<",$xmlDatum);
                $xmlr[$xmlName] = $xmlValue;
            }
        }

        $this->is_result_parsed = $xmlr;
    }
}
?>

1 Ответ

0 голосов
/ 15 сентября 2010

Некоторое понимание:

PHP Notice: Undefined offset: 1 in test.php on line 82 

означает, что содержимое имеет значение NULL. Это обычно происходит при использовании массива, такого как $_POST['somevar'];, когда somevar не существует. Предоставляете ли вы сценарию необходимые данные.

Убедитесь, что ваши переменные действительно содержат данные для каждого номера строки в сообщении об ошибке.

...