【问题标题】:Creating an API for my PHP script - File uploading为我的 PHP 脚本创建 API - 文件上传
【发布时间】:2013-01-21 00:30:07
【问题描述】:

好的,这里是:(我正在第三次更改此帖子的内容以更好地解释)

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

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

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

因此,基本上,用户网站向我的 Image Host 发出 POST/FILES 请求后,他们会收到来自我的上传处理脚本的链接,他们需要检索,然后用于自己的需要。

我的问题是:我的注册用户将文件发送到我的服务器没有重新加载页面并取回 URL那个图像。我该怎么做?


我尝试过的:

我所有的尝试都是阻塞,没有继续。

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

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

我在这里的失败是:

  • 我无法将 ANYTHING 从第 3 方网站异步发送到我的 Image Host
  • 我无法从我的第 3 方网站收到任何回复。

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

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

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

谢谢。

更新

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

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

【问题讨论】:

  • 您是尝试通过 JSON 或 XML 将链接发送到 Ajax 客户端还是以纯文本形式发送到 Ajax 客户端?
  • 我没有尝试使用 JSON,因为我不知道如何使用它,因此提出了问题。我的 AJAX 知识也很有限。
  • 听起来它可以在一个 iframe 中非常简单地处理,该 iframe 包含一个回发到图像主机的真实表单。它看起来像 ajax(因为 iframe 阻止了整页发布),您可以将结果页面中的链接作为响应直接返回给 iframe。
  • @Gavin 你能给我举个例子吗?也许你的答案真的有效,然后我可以接受。

标签: php api file file-upload upload


【解决方案1】:

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

<?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 插件来实现它。这是一个用于提交表单的非常方便的插件,我会向用户展示他们将如何做到这一点。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      如果他们直接写入 API,请遵循相同的约定,但您的用户将直接使用 PUT(PUT 在网络表单中不可用,只有 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元素中,然后将canvas数据转换为字符串。

      【讨论】:

        【解决方案4】:

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

        您可以发出像http://mysite.com/myapi.php?method=sayHello&amp;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();
        

        然后您只需使用带有 jQ​​uery 的 $.getJSON 进行调用。

        【讨论】:

          【解决方案5】:

          尝试使用

          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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-07-12
            • 1970-01-01
            • 1970-01-01
            • 2017-10-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多