15

FLV ファイルの最初の 3 バイトは署名「FLV」です。今私の質問:

ファイルのアップロードの入力ストリームにフックして最初の 3 バイトをチェックできるように、PHP でファイルのアップロードを処理する可能性はありますか?

シナリオは、完全なファイルを (一時フォルダーに) アップロードしてから、ファイルが FLV かどうかを確認するのではなく、アップロード ストリームの最初の数バイトを読みたいだけで、それが「FLV」でない場合です。戻る/出る。

ファイルは HTML ベースのフォームでアップロードする必要があります。JavaScript、フラッシュ アップローダ、またはクライアント側の検証回避策に依存することはできません。つまり、純粋な PHP ベースのソリューションが必要です。

$_POST $_GET $_FILESPHP は、一時フォルダーにファイルをアップロードし、グローバル変数などを設定するまで、スクリプトに制御を渡さないことを既に知っています。

また、やや似た質問がここにあります: How to upload a file byte by byte in php

しかし、回答は私の要件/質問を満たしていません。

どんなアイデアでも大歓迎です!

ありがとう

4

2 に答える 2

9

まず、に設定session.upload_progress.enabledしますphp.ini

次に、session.upload_progressアップロードされたバイト数を追跡​​するために使用します。最小しきい値に達したら、アップロードされている一時ファイルを確認してください$_SESSION[unique_key]['files'][0]['tmp_name']。ファイルが一致しない場合、 に設定$_SESSION[unique_key]["cancel_upload"]するTRUEと、ファイルは拒否されます。

取得するにはunique_key:

ini_get("session.upload_progress.prefix") . $_POST[ini_get("session.upload_progress.name")];

上記が機能しない場合 (私はテストしていません)、唯一の手段は、PHP 用の独自のカスタム ハンドラーを Apache モジュールとして (またはカスタム CGI アプリケーションとして) 作成することです。そこでフィルタリングを行うことができます。

于 2013-07-11T09:52:15.363 に答える
3

@burhan-khalid は、上記のより最新の正しい回答を提供しました。

短い答えは、あなたの制約ではノーです。

サーバーにアップロードされるまで、PHP でそのファイルにアクセスすることはできません。アップロード後は読むことができますが、アップロード前はできません。少なくとも、通常のフォーム送信の代わりに PHP にストリーミングできるクライアント側のソフトウェアがなければできません。

于 2013-07-03T12:33:31.367 に答える