为我的PHP脚本创建API - 文件上传

Dug*_*ugi 7 php api upload file-upload file

好的,这是:(我正在改变这篇文章的内容,第三次更好地解释)

我的网站是一个图像托管网站,这意味着用户可以上传到我的网站并获得他/她上传图像的直接链接.

我需要某种API /方式来从我的网站与我的用户进行通信.我希望在我的网站上注册的用户能够从他们的网站上传图像到我的图像主机,而无需离开他们自己的网站(AJAX,iFrame,cURL,JSON,无论它需要什么).

对我的网站的请求应包括一个&request=api参数,以便用户从我的upload.php脚本返回纯文本.这样我认为我确保从我的网站获取数据/输出的更简单方法.

所以,基本上,从用户的网站POST /文件要求,我的图片主机,他们收到我的上传处理脚本,他们需要检索,然后使用自己的需要链接(S).

我的问题是:我的注册用户将文件发送到我的服务器而不重新加载页面并获取该图像的URL.我该怎么做呢?


我尝试过的:

我所有的尝试都是封锁而没有继续.

首先,我在两个不同的表中添加了两个新列.我的users表收到一个api_key列,如果用户实际注册了该列,则该列用于存储API密钥.另一列is_api被添加到我存储图像信息的表中,只有注册用户将其图像存储在数据库中.使用这个新列(类型TINYINT),我想检查来自用户的图像是否(或没有)通过API添加/上传.

用户使用以下参数向我的图像主机发送请求:upload.php?submit=true&action=upload&request=api&key=_SOME_API_KEY_.我拿了API密钥并检查它属于谁 - >根据该密钥检索用户ID - >我将图​​像存储到我的服务器 - >我将图​​像信息存储在我的数据库中(现在有用户ID) - >我echo出来URL.

我在这里的失败是:

  • 我不能送任何东西从第三方网站,我的图片主机异步
  • 我无法收到回到第三方网站的任何内容.

为什么这些失败?因为我不知道如何实现这两个最重要的步骤.

我停止尝试发送$_FILES[]到我的图像主机的一个想法是尝试通过POSTIMAGE STRING发送到我的服务器并在那里创建图像.我也做不到这一点,只是想到了一个有时间思考的人.

所以,就是这样:我的大问题是没有我自己的解决方案.
如果您需要更多信息以便更轻松地帮助我,请询问.

谢谢.

更新

如果我只是以某种方式(异步)接收文件,我会在数据库中使用is_api值为1的字段注册它,将其标记为通过API(外部)放置.这样,我可以创建一个名为viewer.phpmaybe的新文件,它会接受一些参数viewer.php?request=api&key=_API_KEY_,它会返回一个JSON页面,其中包含该外部api用户指向最新图像的链接.第三方网站通过JSON检索页面非常简单.因此,使用这种方法,我基本上只需要在我的图像主机中以某种方式接收图像,并且检索部分不会太难.那么如何通过POSTIMAGE STRING发送到我的图像主机

如果我的这个新想法可以利用,请告诉我.

Dug*_*ugi 8

我向我的用户提供这样的脚本作为我网站的桥梁:

<?php 
$api_key = 'n8N9v0g9e7b1h0H4A7s2t6q5K8f07B6E4a5p2k4D6L2T1G4Y7I3z5Q5';
$uses_ajax = false;
$imgit = array('error' => true);

if (isset($_POST['imgit_request']))
{
    if ($_POST['imgit_request'] == 'upload')
    {
        $post_data = array(
            'submit'  => 'true',
            'action'  => 'upload',
            'request' => 'api',
            'api_key' => $api_key,
            'imagestr' => chunk_split(base64_encode(file_get_contents($_FILES['images']['tmp_name']))),
            'imagemime' => $_FILES['images']['type'],
            'imagename' => $_FILES['images']['name'],
            'imagesize' => $_FILES['images']['size'],
        );  
    }
    else if ($_POST['imgit_request'] == 'remote')
    {
        $post_data = array(
            'submit'  => 'true',
            'action'  => 'remote',
            'request' => 'api',
            'api_key' => $api_key,
            'links'   => $_POST['links'],
        );  
    }

    $curl = curl_init();
    curl_setopt_array($curl, array(
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_URL => 'http://dugi/imgitv3/upload.php',
        CURLOPT_CONNECTTIMEOUT => 5,
        CURLOPT_POST => 1,
        CURLOPT_POSTFIELDS => $post_data,
    ));

    $resp = curl_exec($curl);
    curl_close($curl);

    if (strpos($resp, 'http://') !== false)
    {
        $imgit = array(
            'direct' => $resp,
            'thumb' => str_replace('/i/', '/t/', $resp),
            'error' => false,
        );

        if ($uses_ajax)
        {
            echo $imgit['direct'];  
        }
    }
    if (strpos($resp, 'http://') === false)
    {
        $imgit = array(
            'error' => $resp,
        );  
    }
}
?>
Run Code Online (Sandbox Code Playgroud)

然后我根据收到的信息在我的网站上完成剩余的处理.我将在我的网站上完成完整的API CP后更新此答案,使用该API的网站管理员可以查看通过其网站将图像上传到我的图像主机的图像.从上面的脚本中,您可以看到一个API密钥 - 它对每个用户都是唯一的,上面的一个只是一个示例.

对于异步,我通过告诉用户使用jQuery Form插件使其工作.这是一个非常方便的提交表单插件,我向用户展示他们将如何做.

感谢所有试图帮助我的人.