複数のファイルを読み込むブラウザー

ユーザーに複数のファイルをダウンロードする機能を提供したい場合、現時点での従来の解決策は、この目的のために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 >



  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 >



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



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



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



  1. ifisset$ _POST [ 'file' ]、 $ _POST [ 'file' ] [ 0 ])){
  2. if$ idx = strpos( $ _POST [ 'file' ] [ 0 ]、 "\ n" )){
  3. $ bound = substr( $ _POST [ 'file' ] [ 0 ]、 2$ idx - 2 );
  4. $ body = "MIME-Version:1.0 \ nContent-type:multipart / form-data; boundary = {$ bound} \ n \ n"
  5. $ _POST [ 'file' ] [ 0 ];
  6. 設定解除$ _POST [ 'file' ] [ 0 ]);
  7. $ f =& $ _FILES [ 'file' ];
  8. $ f [ 'name' ] = $ f [ 'type' ] = $ f [ 'tmp_name' ] = $ f [ 'error' ] = $ f [ 'size' ];
  9. $ msg = mailparse_msg_create();
  10. if (mailparse_msg_parse( $ msg$ body )){
  11. $ i = 0 ;
  12. foreach (mailparse_msg_get_structure( $ msgas $ st ){
  13. $セクション = mailparse_msg_get_part( $ msg$ st );
  14. $ data = mailparse_msg_get_part_data( $セクション );
  15. if$ data [ 'content-type' ] == 'multipart / form-data' ){
  16. 続ける ;
  17. }
  18. ob_start();
  19. if (mailparse_msg_extract_part( $ section$ body )){
  20. $ tmp = tempnam(sys_get_temp_dir()、 'php' );
  21. file_put_contents( $ tmp 、ob_get_clean());
  22. $ f [ 'name' ] [ $ i ] = $ data [ 'disposition-filename' ];
  23. $ f [ 'type' ] [ $ i ] = $ data [ 'content-type' ];
  24. $ f [ 'tmp_name' ] [ $ i ] = $ tmp ;
  25. $ f [ 'error' ] [ $ i ] = 0 ;
  26. $ f [ 'size' ] [ $ i ] = filesize( $ tmp );
  27. $ i ++;
  28. } else {
  29. ob_end_clean();
  30. }
  31. }
  32. }
  33. 設定解除$ f );
  34. mailparse_msg_free( $ msg );
  35. }
  36. }
この記事をPHPブログに投稿するかどうかはよくわかりません。HTMLの方が適しているかもしれません。一方で、PHPで複数の読み込みを一緒に使用する方法を調べています。



コメントで示唆されているように、 PSは「Web開発」に移行しました。ブログは本当にトピックにずっと近いものです。



All Articles