8

さて、ここにあります:(私はよりよく説明するためにこの投稿の内容を3回変更しています)

私のウェブサイトは画像ホスティングウェブサイトです。つまり、ユーザーは私のウェブサイトにアップロードして、アップロードした画像への直接リンクを受け取ることができます。

サイトからユーザーと通信するには、なんらかのAPI/方法が必要です。私のWebサイトに登録されているユーザーが、自分のWebサイト(AJAX、iFrame、cURL、JSONなど)を離れることなく、自分のWebサイトから画像ホストに画像をアップロードできるようにしたいと思います。

&request=apiユーザーがupload.phpスクリプトからプレーンテキストを返すように、私のWebサイトへのリクエストにはパラメーターを含める必要があります。このようにして、自分のサイトからデータ/出力を取得する簡単な方法を確保できると思います。

したがって、基本的に、ユーザーのサイトから私の画像ホストへのPOST / FILESリクエストの後、ユーザーはアップロード処理スクリプトからリンクを受け取ります。これらのリンクを取得して、自分のニーズに使用する必要があります。

私の質問は登録ユーザーがページをリロードせずにサーバーにファイルを送信し、その画像へのURLを取得することです。どうすればよいですか?


私が試したこと:

私の試みはすべて、継続することなく閉塞でした。

まず、2つの異なるテーブルに2つの新しい列を追加しました。私のusersテーブルapi_keyは、ユーザーが実際にサインアップした場合にAPIキーを格納することを目的とした列を受け取りました。もう1つの列は、画像情報is_apiを保存するテーブルに追加されました。登録されたユーザーのみが画像をデータベースに保存します。この新しい列(タイプ)を使用して、ユーザーからの画像がAPIを介して追加/アップロードされている(または追加されていない)ことを確認したいと思いました。TINYINT

ユーザーは、次のパラメーターを使用してイメージホストにリクエストを送信しますupload.php?submit=true&action=upload&request=api&key=_SOME_API_KEY_。APIキーを取得し、それが誰に属しているかを確認します->そのキーに基づいてユーザーIDを取得します->画像をサーバーに保存します->画像情報をデータベースに保存します(現在はユーザーIDを持っています)->私echoはURL。

ここでの私の失敗は次のとおりです。

  • サードパーティのWebサイトからイメージホストに非同期で何も送信できませんでした
  • サードパーティのWebサイトに何も返されませんでした。

なぜこれらの失敗?これらの2つの最も重要なステップをどのように達成するかがわからないためです。

イメージホストへの送信を停止するための私のアイデアの1つは、POSTを介してイメージ文字列をサーバーに送信$_FILES[]し、そこでイメージを自分で作成しようとすることでした。私もできませんでした。考える時間があった男の思いでした。

だから、これはそれです:私自身からの解決策のない私の大きな問題。
私をより簡単に助けるためにもっと情報が必要な場合は、お問い合わせください。

ありがとうございました。

アップデート

なんらかの方法で(非同期に)ファイルを受信できた場合は、値1is_apiのフィールドを使用してデータベースに登録し、API(外部)経由で配置されたものとしてマークします。このようにして、maybeという名前の新しいファイルを作成できます。このファイルは、似たようないくつかのパラメーターを受け入れ、その外部APIユーザーによる最新の画像へのリンクを含むJSONページを返します。サードパーティのWebサイトでJSONを介してページを取得するのは非常に簡単です。したがって、この方法では、基本的に画像ホストで画像を受信する必要があり、取得部分はそれほど難しくありません。では、 POSTを介して画像文字列画像ホストに送信するにはどうすればよいですか?viewer.phpviewer.php?request=api&key=_API_KEY_

私のこの新しいアイデアが悪用可能である場合は、私に知らせてください。

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

次に、受け取った情報に基づいて、Webサイトで残りの処理を行います。ウェブサイトで完全なAPICPを完了したら、この回答を更新します。APIを使用しているウェブマスターは、自分のウェブサイトから画像ホストにアップロードされた画像を確認できます。上記のスクリプトから、APIキーを確認できます。これはすべてのユーザーに固有であり、上記の1つは単なるサンプルです。

非同期の場合、jQueryフォームプラグインを使用するようにユーザーに指示することで機能させました。これはフォームを送信するための非常に便利なプラグインであり、ユーザーにその方法を示します。

私を助けようとしたすべての人に感謝します。

于 2013-02-13T20:16:06.493 に答える
2

使ってみてください

json_encode()

問題のリンクのphp側(JSON mimetypeヘッダーを含めることを忘れないでください)と

$.getJSON()

受信側でjQueryを使用します。次に、結果のリンクをdivまたはparagraph(またはその他)に配置できます。ハイパーリンクが変更/更新されている既存のハイパーリンクである場合は、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としてエンコードします。

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();

次に、jQueryで$.getJSONを使用して呼び出しを行います。

于 2013-02-12T18:59:59.923 に答える
0

Webフォームを使用しているようですので、厳密にPOSTを使用する必要があります。クライアントに文字列を送信させたい場合は、どこかでスクリプトを使用して回避することはできません(しかし、なぜこれを実行させるのでしょうか?)。

フォームをPOSTしている場合は、POSTメソッドを使用してから、サーバー側スクリプトでPUTを使用してバックエンドAPIサーバーに書き込みます。これにより、最新の画像へのリンクを含むJSONページが返されます。

APIに直接書き込む場合は、ユーザーがPUTを直接使用することを除いて同じ規則に従います(PUTはWebフォームでは使用できず、POSTとGETのみです)。

編集:HTML5を使用するクライアント側のための可能な解決策があります。画像をhtml5キャンバスに入れて、データを文字列に変換することができます。次に、その文字列を取得して、フォームからPOSTします。これを行う方法の詳細については、この回答を参照してください。

<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>

要約すると、画像をキャンバスのDOM要素に配置してから、キャンバスのデータを文字列に変換します。

于 2013-02-12T15:55:30.577 に答える
0

POSTを介してupload.phpを使用してサードパーティサイトから画像ホストに元のリクエストを受信し、upload.php内で、AJAX呼び出しを使用してリクエストを別のページにルーティングするのはどうですか。このようにして、非同期になります。この方法で達成できると思います。

于 2013-02-13T10:58:04.883 に答える