PHP 5.2.1 以降を使用していて、 および で HTTPS ストリーム ラッパーを使用できると仮定するcopy()
とfile_get_contents()
、必要なのはこの関数だけです。
function getFilepickerFiles($tokens)
{
$files = array('name' => array(),
'type' => array(),
'tmp_name' => array(),
'error' => array(),
'size' => array());
$tmpdir = sys_get_temp_dir();
foreach($tokens as $token)
{
$files['tmp_name'][] = $tmp = $tmpdir.'/php'.$token;
$files['error'][] = copy('https://www.filepicker.io/api/file/'.$token, $tmp) ? UPLOAD_ERR_OK : UPLOAD_ERR_NO_FILE;
$files['size'][] = filesize($tmp);
$meta = json_decode(file_get_contents('https://www.filepicker.io/api/file/'.$token.'/metadata?filename=true&mimetype=true'), TRUE);
$files['name'][] = $meta['filename'];
$files['type'][] = $meta['mimetype'];
}
return array('image' => $files);
}
この関数は、トークンの配列 ( などhFHUCB3iTxyMzseuWOgG
) を引数として取ります。
次のように呼び出すことができます
getFilepickerFiles(array('hFHUCB3iTxyMzseuWOgG'));
Filepicker がサーバーに何を渡すか正確にはわかりませんが、次のような完全なファイル URL の場合
https://www.filepicker.io/api/file/hFHUCB3iTxyMzseuWOgG
次に、次のようにトークンを抽出できます。
$tokens = array();
foreach($urls as $url)
{
$matches = array();
preg_match('# ^https://www\\.filepicker\\.io/api/file/([^/]*)/?', $url, $matches);
$tokens[] = $matches[1];
}
// Pass $tokens to getFilepickerFiles()
getFilepickerFiles()
代わりにファイル URL の配列を取るために、その権利を入れることもできます:
function getFilepickerFiles($urls)
{
$files = array('name' => array(),
'type' => array(),
'tmp_name' => array(),
'error' => array(),
'size' => array());
$tmpdir = sys_get_temp_dir();
foreach($urls as $url)
{
$matches = array();
preg_match('# ^https://www\\.filepicker\\.io/api/file/([^/]*)/?', $url, $matches);
$token = $matches[1];
$files['tmp_name'][] = $tmp = $tmpdir.'/php'.$token;
$files['error'][] = copy('https://www.filepicker.io/api/file/'.$token, $tmp) ? UPLOAD_ERR_OK : UPLOAD_ERR_NO_FILE;
$files['size'][] = filesize($tmp);
$meta = json_decode(file_get_contents('https://www.filepicker.io/api/file/'.$token.'/metadata?filename=true&mimetype=true'), TRUE);
$files['name'][] = $meta['filename'];
$files['type'][] = $meta['mimetype'];
}
return array('image' => $files);
}
説明
上記のコードはかなり単純だと思いますが、仕組みは次のとおりです (これを読む前に、 Rest API のドキュメントgetFilepickerFiles()
を読んでおく必要があります)。
$files = array('name' => array(),
'type' => array(),
'tmp_name' => array(),
'error' => array(),
'size' => array());
$files
ファイルを含まないような配列に初期化し$_FILES
ます。
$tmpdir = sys_get_temp_dir();
ファイルをそこにダウンロードするため、一時ファイルが保存されているディレクトリを取得します (この関数には PHP 5.2.1 以降が必要です)。
foreach($urls as $url)
明確にするforeach
必要があります。
$files['tmp_name'][] = $tmp = $tmpdir.'/php'.$token;
パターンに従って、一時ファイル パスを$_FILES
作成します (つまり、一時ファイル フォルダーのパス、文字列 "php"、およびいくつかのランダムな文字)。
その名前を$tmp
(後で簡単に使用できるように) 割り当て、ファイル パスのリストに追加します。
$files['error'][] = (int)(!copy('https://www.filepicker.io/api/file/'.$token, $tmp));
URL をソースとして$tmp
使用して、ファイルのダウンロードを試みます。
によって返される値は、成功時と失敗時です。
に存在するエラー値は、成功した場合とその他の値です ( source、失敗した場合はここで使用します)。
したがって、意味のあるエラー値を割り当てるために、三項演算子を使用してエラー コードのリストに if returnsを追加し、そうでない場合に追加します。copy()
copy()
TRUE
FALSE
$_FILES
UPLOAD_ERR_OK
UPLOAD_ERR_NO_FILE
UPLOAD_ERR_OK
copy()
TRUE
UPLOAD_ERR_NO_FILE
$files['size'][] = filesize($tmp);
ファイルのサイズを照会し、ファイル サイズのリストに追加します。
$meta = json_decode(file_get_contents('https://www.filepicker.io/api/file/'.$token.'/metadata?filename=true&mimetype=true'), TRUE);
への引数として URL を使用してファイル メタデータを取得しますfile_get_contents()
。これは、 を使用して連想配列にデコードする JSON 配列を返す必要がありますjson_decode(/*...*/, TRUE)
。URL の末尾に
追加したため、取得するのは値のみであり、残りはすべて必要ありません。
に割り当てるデコードされた配列。&filename=true&mimetype=true
filename
mimetype
$meta
$files['name'][] = $meta['filename'];
$files['type'][] = $meta['mimetype'];
filename
値を追加し、mimetype
デコードしたばかりの JSON 配列からファイル名と MIME タイプのリストにそれぞれ追加します。
return array('image' => $files);
image
作成したファイルの配列を指すキーを持つ配列を返します。
これで完了です。
デモ?:(
この回答を書くのに必要な時間の 5 倍の時間がかかるため、このためにファイル ホスティング Web サイト全体を構築するつもりはありません。
申し訳ありませんが、完全に機能するライブ デモを提供することはできません。
残念ながら、3v4lもcodepadもHTTPS ストリーム ラッパーを有効にしていないため、「自分の目で確かめる」概念実証のデモを提供することさえできません。
私ができる最善の方法は、おそらくターミナル ウィンドウのスクリーンショットです (クリックして拡大)。
