0

信頼できるチーム メンバーが php と curl を介してリモート ファイルをサーバーに保存できるようにする、チーム用の内部ツールを作成しています。オープン、書き込み、クローズは完全に機能していますが、ローカル ファイルを作成して書き込む前に、ファイルが特定の MIME タイプであることを確認するチェックを追加したいと考えています。

MIME タイプの配列に基づいて、これを行うにはどうすればよいですか?

$ch = curl_init();
$fp = fopen($local_file, 'w+');
$ch = curl_init($remote_file);
curl_setopt($ch, CURLOPT_TIMEOUT, 50);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_ENCODING, "");
curl_exec($ch);
curl_close($ch);
fclose($fp);
4

3 に答える 3

1

ファイルが転送された後、fileinfo を介して MIME をチェックすることでこれを解決しました。有効な MIME タイプでない場合は、削除します。

$ch = curl_init();
$fp = fopen($local_file, 'w+');
$ch = curl_init($remote_file);
curl_setopt($ch, CURLOPT_TIMEOUT, 50);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_ENCODING, "");
curl_exec($ch);
curl_close($ch);
fclose($fp);

$finfo = new finfo(FILEINFO_MIME);
$mime_type = $finfo->file($local_file);

if (strpos($mime_type, 'application/xml') === false) {
    unlink($local_file);
}
于 2013-03-19T13:56:27.037 に答える
0

トリッキー!最初にファイル全体を (メモリまたは一時フォルダーに) ダウンロードすることができます。

  1. CURLOPT_HEADER を設定して、返されるデータに HTTP 応答ヘッダーを含めます。

  2. CURLOPT_FILE の代わりに CURLOPT_WRITEFUNCTION を設定し、http ヘッダーを読み取って解析し、MIME タイプを確認してから、ファイルを作成/書き込みするかどうかを決定します。

HTTP ヘッダーの基本的な解析と、場合によっては HTTP ヘッダー全体を一度に取得するためのバッファリングを行う必要があるため、明らかにこれはかなりの作業です。

うまくいけば、誰かがより簡単な解決策を投稿します。

疑似コード:

state = headers
buf = ''
fd = null
func writefunc(ch, data)
   if state is headers
      buf .= data
      div = buf.strpos "\r\n\r\n"
      if div !== false
         mime = get_mime buf, div
         if mime_ok mime
            fd = fopen ...
            fd.write buf.substr div+4
            state = saving
         else
            # returns other than data.length() abort connection
            return 0
  else
     fd.write data
  return data.length()
于 2013-03-18T20:14:41.517 に答える