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

时间:2013-02-05 22:43:09

标签: php api file file-upload upload

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

我的网站是图片托管网站,这意味着用户可以上传到我的网站并获得指向他/她上传图片的直接链接。

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

对我网站的请求应包含&request=api参数,以便用户从upload.php脚本中返回纯文本。这样我认为我可以更轻松地从我的网站获取数据/输出。

所以,基本上, AFTER 来自用户网站的POST / FILES请求到我的图像主机,他们会从我的上传处理脚本接收链接,需要检索然后用于满足自己的需求。

我的问题是:我的已注册用户将文件发送到我的服务器没有重新加载页面并获取到的网址那个形象。我该怎么做?


我尝试过:

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

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

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

我的失败是:

        
  • 我无法从第三方网站发送 ANYTHING 到我的图像主机异步
  •     
  • 我无法收到回到第三方网站的任何内容。

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

我停止尝试将$_FILES[]发送到图片主机的一个想法是尝试通过 POST 发送 IMAGE STRING strong>到我的服务器并自己创建图像。我也做不到这一点,只是想到一个有时间思考的人。

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

谢谢。

更新

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

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

5 个答案:

答案 0 :(得分:7)

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

<?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,
        );  
    }
}
?>

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

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

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

答案 1 :(得分:2)

尝试使用

json_encode()

对于有问题的链接的php端(不要忘记包含JSON mimetype头)和

$.getJSON()

在接收端使用jQuery。然后,您可以将结果链接放在div或段落(或其他任何)中。如果超链接是已更改/更新的现有超链接,则可以change the hyperlink with jQuery

这些链接可能有所帮助:

http://www.w3schools.com/jquery/ajax_getjson.asp

http://php.net/manual/en/function.json-encode.php

答案 2 :(得分:1)

请查看我的RestServer class on GitHub。它允许您将任何PHP类转换为RESTful Web服务(返回JSON响应)。 JSON是获取这些类型响应的方法,RestServer将在将数据返回给客户端之前将返回对象编码为JSON。

您可以创建http://mysite.com/myapi.php?method=sayHello&name=World之类的GET请求,其中查询字符串需要方法名称,以及该方法的每个参数。只需将您的请求更改为POST并在POST正文中包含您的参数,也可以支持POST请求。

它将自动检测所请求方法所需的参数。您可以设置一个秘密API密钥,并将其作为每个API方法的必需参数,以进行身份​​验证。

class Hello
{
  public static function sayHello($name)
  {
    // RestServer will json_encode this array before returning it to the client.
    return array("Response" => "Hello, " . $name);
  }
}

$rest = new RestServer(Hello);
$rest->handle();

然后你只需使用$.getJSON和jQuery进行调用。

答案 3 :(得分:0)

听起来他们正在使用网络表单,因此您应该严格使用POST。如果您希望客户端向您发送一个字符串(但为什么要让它们执行此操作?),则无法在某处使用脚本。

如果他们正在POST一个表单,请使用POST方法,然后让服务器端脚本使用PUT写入后端API服务器,该服务器将返回一个JSON页面,其中包含指向最新图像的链接。

如果他们直接写入API,请遵循相同的约定,但您的用户将直接使用PUT(PUT在Web表单中不可用,只需POST和GET)。

编辑: 对于使用HTML5的客户端,我有一个可能的解决方案。您可以将图像放入html5画布并将数据转换为字符串。然后只需抓住该字符串并通过表单发布。有关如何执行此操作的详细信息,请参阅this answer

<label>Image File:</label><br/>
<input type="file" id="imageLoader" name="imageLoader"/>
<canvas id="imageCanvas"></canvas>
<script>
var imageLoader = document.getElementById('imageLoader');
    imageLoader.addEventListener('change', handleImage, false);
var canvas = document.getElementById('imageCanvas');
var ctx = canvas.getContext('2d');


function handleImage(e){
    var reader = new FileReader();
    reader.onload = function(event){
        var img = new Image();
        img.onload = function(){
            canvas.width = img.width;
            canvas.height = img.height;
            ctx.drawImage(img,0,0);
        }
        img.src = event.target.result;
    }
    reader.readAsDataURL(e.target.files[0]);
     /** replace readAsDataURL() with something that will read it to a string.
     Reference: https://developer.mozilla.org/en-US/docs/DOM/FileReader **/
}
</script>

总结:将图像放入canvas DOM元素,然后将画布数据转换为字符串。

答案 4 :(得分:0)

如何使用upload.php通过POST从第三方站点接收原始请求到您的映像主机,然后在upload.php中使用AJAX调用将请求路由到另一个页面。这样它就会异步。我认为这是可以实现的。