ユーザーに複数のファイルをダウンロードする機能を提供したい場合、現時点での従来の解決策は、この目的のためにFlashを使用することです(JavaアプレットまたはActiveXはそれほど頻繁ではありません)。 対応するプラグインが利用できない場合、ユーザーには通常、ファイルをダウンロードするための標準HTML要素が表示されます。
後者の状況は、複数のファイルをダウンロードする組み込みのブラウザー機能を使用すると改善できます。 すべてのブラウザーの中で、Internet Explorerのみが現在この機能をサポートしていません(ただし、9番目のバージョンはまだ見ていませんが、何か変更される可能性があります)。他のブラウザーはOpera 9以降(バージョン3.5-6.05)、Firefox 3.6以降、 Chrome 3.0.191.0+およびSafari 4.0.1+はこの機能を提供します。
次のようなものを書くだけで十分です
Copy Source | Copy HTML < form enctype ="multipart/form-data" method ="post"> < input type ="file" min ="1" max ="9999" name ="file[]" multiple ="true" /> < input type ="submit" name ="submit" /> </ form >
Copy Source | Copy HTML < form enctype ="multipart/form-data" method ="post"> < input type ="file" min ="1" max ="9999" name ="file[]" multiple ="true" /> < input type ="submit" name ="submit" /> </ form >
Copy Source | Copy HTML < form enctype ="multipart/form-data" method ="post"> < input type ="file" min ="1" max ="9999" name ="file[]" multiple ="true" /> < input type ="submit" name ="submit" /> </ form >
Copy Source | Copy HTML < form enctype ="multipart/form-data" method ="post"> < input type ="file" min ="1" max ="9999" name ="file[]" multiple ="true" /> < input type ="submit" name ="submit" /> </ form >
Copy Source | Copy HTML < form enctype ="multipart/form-data" method ="post"> < input type ="file" min ="1" max ="9999" name ="file[]" multiple ="true" /> < input type ="submit" name ="submit" /> </ form >
PHPは、そのような構築の準備ができていることがわかりました(角括弧が「名前」パラメーターにあるのは彼のためです)。
残念ながら、Opera(バージョン3.5以降)は、マルチブートを使用する場合、PHPが理解できないmultipart / mixedコンテナ内のファイルを送信します。
私はこの状況を修正しようとしました。
幸いなことに、そのようなリクエストを受け入れたPHPは、その内容を$ _POST配列に入れます(この場合、$ _POST ['file'] [0]に分類されます。残りは、それを解析して$ _FILESに転送することです
magic_quotes_gpcは無効になっています)。
パーサーとしてPECLモジュール
mailparseを使用し
ました (
Windows用のバイナリがあります )。
私の例では、「ファイル」パラメーターが想定されていますが、この値を設定に入れるのは簡単です。 コードはコメントしないほどシンプルに思えますが、不明な点がある場合はコメントを追加します。
Copy Source | Copy HTML
- if ( isset ( $ _POST [ 'file' ]、 $ _POST [ 'file' ] [ 0 ])){
- if ( $ idx = strpos( $ _POST [ 'file' ] [ 0 ]、 "\ n" )){
- $ bound = substr( $ _POST [ 'file' ] [ 0 ]、 2 、 $ idx - 2 );
- $ body = "MIME-Version:1.0 \ nContent-type:multipart / form-data; boundary = {$ bound} \ n \ n" 。
- $ _POST [ 'file' ] [ 0 ];
- 設定解除 ( $ _POST [ 'file' ] [ 0 ]);
- $ f =& $ _FILES [ 'file' ];
- $ f [ 'name' ] = $ f [ 'type' ] = $ f [ 'tmp_name' ] = $ f [ 'error' ] = $ f [ 'size' ];
- $ msg = mailparse_msg_create();
- if (mailparse_msg_parse( $ msg 、 $ body )){
- $ i = 0 ;
- foreach (mailparse_msg_get_structure( $ msg ) as $ st ){
- $セクション = mailparse_msg_get_part( $ msg 、 $ st );
- $ data = mailparse_msg_get_part_data( $セクション );
- if ( $ data [ 'content-type' ] == 'multipart / form-data' ){
- 続ける ;
- }
- ob_start();
- if (mailparse_msg_extract_part( $ section 、 $ body )){
- $ tmp = tempnam(sys_get_temp_dir()、 'php' );
- file_put_contents( $ tmp 、ob_get_clean());
- $ f [ 'name' ] [ $ i ] = $ data [ 'disposition-filename' ];
- $ f [ 'type' ] [ $ i ] = $ data [ 'content-type' ];
- $ f [ 'tmp_name' ] [ $ i ] = $ tmp ;
- $ f [ 'error' ] [ $ i ] = 0 ;
- $ f [ 'size' ] [ $ i ] = filesize( $ tmp );
- $ i ++;
- } else {
- ob_end_clean();
- }
- }
- }
- 設定解除 ( $ f );
- mailparse_msg_free( $ msg );
- }
- }
この記事をPHPブログに投稿するかどうかはよくわかりません。HTMLの方が適しているかもしれません。一方で、PHPで複数の読み込みを一緒に使用する方法を調べています。
コメントで示唆されているように、
PSは「Web開発」に移行しました。ブログは本当にトピックにずっと近いものです。