8

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

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

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

对我的网站的请求应该包含一个&request=api参数,以便用户从我的 upload.php 脚本中获取纯文本。通过这种方式,我认为我可以确保以更简单的方式从我的站点获取数据/输出。

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

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


我试过的:

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

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

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

我在这里的失败是:

  • 我无法从第 3 方网站异步向我的Image Host发送任何内容
  • 我无法收到任何返回到我的第 3 方网站的信息。

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

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

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

谢谢你。

更新

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

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

4

5 回答 5

10

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

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

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

于 2013-02-13T20:16:06.493 回答
2

尝试使用

json_encode()

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

$.getJSON()

在接收端使用 jQuery。然后,您可以将生成的链接放在您喜欢的 div 或段落(或其他任何内容)中。如果超链接是已存在的正在更改/更新的超链接,您可以使用 jQuery 更改超链接

这些链接可能会有所帮助:

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

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

于 2013-02-06T02:39:25.350 回答
1

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

您可以发出 GET 请求http://mysite.com/myapi.php?method=sayHello&name=World,例如查询字符串需要方法名称以及该方法的每个参数。只需将您的请求更改为 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进行调用。

于 2013-02-12T18:59:59.923 回答
0

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

于 2013-02-13T10:58:04.883 回答
0

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

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

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

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

<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 数据转换为字符串。

于 2013-02-12T15:55:30.577 回答