【问题标题】:IMGUR file upload via PHP and cURL通过 PHP 和 cURL 上传 IMGUR 文件
【发布时间】:2011-08-04 03:40:39
【问题描述】:

我正在尝试通过 PHP 将图像上传到 IMGUR。 这是代码:

<?
$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 生成的字符串? 谢谢, 鲍勃

【问题讨论】:

  • 这意味着 PHP 找不到 'image.jpg' 并且无法“打开”它。如果图像文件与此脚本不在同一目录中,则必须指定指向图像的路径。绝对路径 (/path/to/image) 或相对于脚本的路径 (../../elsewhere/image.jpg)。

标签: php curl imgur


【解决方案1】:

该警告是因为 fopen 正在尝试从运行脚本的目录中读取文件 image.jpg。 关于如何通过 curl 传输文件的一个很好的例子可以在这里看到

Send file via cURL from form POST in PHP

他们有 $localFile = $_FILES[$fileKey]['tmp_name'];你会放 $localFile = '/path/to/image.jpg';以及更改服务器信息并添加您可能需要传递给 imgur 的任何其他变量。

【讨论】:

  • 我不明白“image.jpg”的来源。据我了解,PHP 从我发送的 base64 字符串生成它,然后将其放在 PHP 文件所在的文件夹中,对吧?
  • 好的,我想我找到了。只需要删除这部分:$filename = "image.jpg"; $handle = fopen($filename, "r"); $data = fread($handle, filesize($filename)); 但是还有一个问题悬而未决 - 我如何收到来自 IMGUR 的带有上传图片路径的回调或响应?
  • 您将得到一个 xml 响应。您需要从保存在变量 $xml 中的响应中提取 URL 标记。文档在这里:api.imgur.com/responses
  • 我正在使用带有 PHP 的 Actionscript 3 (AS3) 来上传图像。我从 IMGUR 示例中获取了这个,但它返回的只是空的:var iresponse:XML = new XML(unescape(loader.data)); 有什么想法吗?
  • 如何将 PHP 的响应发送到 Flash?
【解决方案2】:

将第 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 KEY: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);
    }
?>

【讨论】:

    猜你喜欢
    • 2016-02-22
    • 2017-10-25
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    • 2019-05-29
    • 2012-11-24
    • 1970-01-01
    相关资源
    最近更新 更多