**[[質問箱4/594]] [#td5c328b] #author("2018-03-11T21:02:43+09:00;2010-06-22T18:03:19+09:00","","") **[[質問箱/4594]] [#td5c328b] |RIGHT:70|LEFT:410|c |~カテゴリ|| |~サマリ|添付ファイルが壊れる| |~バージョン|1.4.7| |~投稿者|[[sato.is-tech]]| |~状態|完了| |~投稿日|&new{2010-06-18 (金) 18:01:35};| ***質問 [#m4e953ea] EXCELファイルを添付ファイルにアップロードして、ダウンロードするとファイルが壊れてしまいます。 attachフォルダのファイルをFTPでダウンロードして、対象ファイルを開くと大丈夫のようです。 ※最初ファイル名も文字化けしてしまっていたので、過去の質問を参照しattach.inc.phpを直すことで 解決することができました。 attach.inc.phpのopen()メソッドのコードは現在以下のような状況となっております。 function open() { $this->getstatus(); $this->status['count'][$this->age]++; $this->putstatus(); $filename = $this->file; echo("filename:{$filename}<br />"); echo("this->size:{$this->size}<br />"); echo("this->type:{$this->type}<br />"); echo("this->filename:{$this->filename}<br />"); if(ereg("MSIE",$_SERVER["HTTP_USER_AGENT"])){ $filename = htmlspecialchars(mb_convert_encoding($this->file,'SJIS','auto')); $filename = htmlspecialchars($filename); }else{ $filename = htmlspecialchars(mb_convert_encoding($this->file,'UTF-8','auto')); $filename = htmlspecialchars($filename); } ini_set('default_charset',''); mb_http_output('pass'); header('Content-Disposition: inline; filename="' . $filename . '"'); header('Content-Length: ' . $this->size); header('Content-Type: ' . $this->type); flush(); @readfile($this->filename); exit; } [[質問箱/236]] [[続・質問箱/33]] [[質問箱/2033]] を参考にしましたが、解決することができません。お手数ですがご教授ください。 クライアント環境: OS:windows Xp SP3 ブラウザ:google Chrome 5.0.375.70 サーバ環境: レンタルサーバ:sixcore S1 OS:Linux PHP Version 5.1.6 mbstringの設定 Multibyte Support enabled Multibyte string engine libmbfl Multibyte (japanese) regex support enabled Multibyte regex (oniguruma) version 3.7.1 Local & Master Value mbstring.detect_order auto mbstring.encoding_translation Off mbstring.func_overload 0 mbstring.http_input auto mbstring.http_output SJIS mbstring.internal_encoding EUC-JP mbstring.language Japanese mbstring.strict_detection Off mbstring.substitute_character no value ***回答 [#i082501c] - [[Q. 添付ファイルが表示できない>Q&A/プラグイン/attachプラグイン#h577586a]] -- &new{2010-06-18 (金) 18:23:22}; - 壊れたファイルをテキストエディタなどで見ると、 filename:ファイル名<br />this->size:ファイルサイズ<br />this->type:ファイルタイプ<br />this->filename:PukiWikiが保管している時のファイル名<br /> が最初に混ざっていませんか?バイナリファイルが壊れる原因の1つに、「不必要なデータが入る(混ざる)」というのがあります。 -- &new{2010-06-18 (金) 18:27:51}; -- AttachFiles::open()はダウンロード用なので、ダウンロード用のヘッダーとファイルの生データ以外(PHPのエラーメッセージなど)が出力されると、簡単に壊れたファイルデータになってしまいます。 -- &new{2010-06-18 (金) 18:31:55}; - 質問箱/236と続・質問箱/33の内容は、1.4.3以降のパッケージに含まれていますよ -- &new{2010-06-18 (金) 18:33:43}; - 壊れたファイルをテキストエディタなどで見たところ、ご指摘の内容が記述されていました。 これが入らないようにするにはどうしたら良いのでしょうか? -- [[sato.is-tech]] &new{2010-06-18 (金) 18:54:38}; - 「コードは現在以下のような状況」のソースで、4行にわたって[[echo()>PHP関数:echo]]している部分(<br />とかそのものが書かれているところ)が不要です。それをコメントにするなり消すなりして、実行しないように変更してみてください。 -- &new{2010-06-18 (金) 20:24:58}; - echo()している部分を消して実行しましたが、結果は同じでした。 -- [[sato.is-tech]] &new{2010-06-21 (月) 11:59:16}; - [[質問箱/333]], [[続・質問箱/201]] -- &new{2010-06-21 (月) 17:32:17}; - [[質問箱/333]], [[質問箱/2201]] -- &new{2010-06-21 (月) 17:32:17}; - 結果が同じということは、新しくダウンロードした分でもfilename:~が混ざったままって事? -- &new{2010-06-21 (月) 22:56:03}; - filename:~は混ざっていませんでしたが、文字化けな状況です。正確にお伝えできずすみませんでした。 -- [[sato.is-tech]] &new{2010-06-22 (火) 11:04:55}; - バイナリエディタなどで、壊れている方と壊れていない方との差分をとってみるとか? -- &new{2010-06-22 (火) 11:22:03}; - WinMergeで比較したところ、Header部分とFooter部分に差分が見られましたが、目視では違いをみつけることができませんでした・・・ -- [[sato.is-tech]] &new{2010-06-22 (火) 13:01:34}; - Header部分の違いは改行(バイナリエディタで表示した時、16進数の「0A」や「0D」)が余分についている状態ですか?もしそうなら、[[質問箱4/352]]などが参考になるかもしれません。 -- &new{2010-06-22 (火) 14:14:29}; - バイナリエディタやテキストエディタで確認するかぎりでは、改行の違いかどうかは判定できませんでした。 ご教授いただいた[[質問箱4/352]]にあるiniの改行が~という対象ファイルは、1.4.7版でいうところのja.lng.php,pukiwiki.ini.phpでしょうか?そちらの方の改行の状態を見る限りでは改行コードはLF,不要な改行は見当たりませんでした。 -- [[sato.is-tech]] &new{2010-06-22 (火) 15:46:41}; - Header部分の違いは改行(バイナリエディタで表示した時、16進数の「0A」や「0D」)が余分についている状態ですか?もしそうなら、[[質問箱/4352]]などが参考になるかもしれません。 -- &new{2010-06-22 (火) 14:14:29}; - バイナリエディタやテキストエディタで確認するかぎりでは、改行の違いかどうかは判定できませんでした。 ご教授いただいた[[質問箱/4352]]にあるiniの改行が~という対象ファイルは、1.4.7版でいうところのja.lng.php,pukiwiki.ini.phpでしょうか?そちらの方の改行の状態を見る限りでは改行コードはLF,不要な改行は見当たりませんでした。 -- [[sato.is-tech]] &new{2010-06-22 (火) 15:46:41}; - とりあえずバックアップして、pukiwikiを再インストールして添付ファイルをアップロードして、データを確認したところ正しく表示されました。しかしながら添付ファイルを日本語にするとダウンロード時にファイル名が文字化けしてしまいます。 -- [[sato.is-tech]] &new{2010-06-22 (火) 16:00:15}; - 文字化けの件は無事解決しました。原因は、1.4.7のattach.inc.phpのAttachFiles::open() ファイル名のエンコード処理箇所でオペラとIEしか対応していなかったためのようです。default文を追記し、$filename = mb_convert_encoding($filename, 'SJIS', 'auto');を追記することで解決できました。 -- [[sato.is-tech]] &new{2010-06-22 (火) 16:13:26}; - IE8,Chrome5,FireFox3,Safari5,Opera10.54にて動作確認したところ、IE8:○,Chrome5:○,FireFox3:×,Safari5:×,Opera10.54:×といった結果で文字化けの現状が確認できました。(○が文字化けしない、×が文字化けする)ファイル名の文字エンコード処理の部分をちょっと見直して改修してみます。 -- [[sato.is-tech]] &new{2010-06-22 (火) 16:27:35}; - AttachFiles::open()の文字エンコード処理の部分を以下のような変更を加えたことにうまくできました。 -- [[sato.is-tech]] &new{2010-06-22 (火) 17:31:55}; Before if (LANG == 'ja') { switch(UA_NAME . '/' . UA_PROFILE){ case 'Opera/default': $filename = mb_convert_encoding($filename, 'SJIS', 'auto'); break; case 'MSIE/default': $filename = mb_convert_encoding($filename, 'SJIS', 'auto'); break; } } After if (LANG == 'ja') { switch(UA_NAME . '/' . UA_PROFILE){ case 'Opera/default': $filename = mb_convert_encoding($filename, 'SJIS', 'auto'); break; case 'MSIE/default': $filename = mb_convert_encoding($filename, 'SJIS', 'auto'); break; case 'Mozilla/default': if(eregi('Chrome', getenv( "HTTP_USER_AGENT" ))){ $filename = mb_convert_encoding($filename, 'SJIS', 'auto'); } else{ $filename = mb_convert_encoding($filename, 'EUC', 'auto'); } break; case 'Firefox/default': $filename = mb_convert_encoding($filename, 'EUC', 'auto'); break; default: $filename = mb_convert_encoding($filename, 'SJIS', 'auto'); break; } } //#comment