質問箱/4594

カテゴリ
サマリ添付ファイルが壊れる
バージョン1.4.7
投稿者sato.is-tech?
状態完了
投稿日2010-06-18 (金) 18:01:35

質問

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 質問箱/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

回答

  • Q. 添付ファイルが表示できない -- 2010-06-18 (金) 18:23:22
  • 壊れたファイルをテキストエディタなどで見ると、
    filename:ファイル名<br />this->size:ファイルサイズ<br />this->type:ファイルタイプ<br />this->filename:PukiWikiが保管している時のファイル名<br />
    が最初に混ざっていませんか?バイナリファイルが壊れる原因の1つに、「不必要なデータが入る(混ざる)」というのがあります。 -- 2010-06-18 (金) 18:27:51
    • AttachFiles::open()はダウンロード用なので、ダウンロード用のヘッダーとファイルの生データ以外(PHPのエラーメッセージなど)が出力されると、簡単に壊れたファイルデータになってしまいます。 -- 2010-06-18 (金) 18:31:55
  • 質問箱/236と続・質問箱/33の内容は、1.4.3以降のパッケージに含まれていますよ -- 2010-06-18 (金) 18:33:43
  • 壊れたファイルをテキストエディタなどで見たところ、ご指摘の内容が記述されていました。 これが入らないようにするにはどうしたら良いのでしょうか? -- sato.is-tech? 2010-06-18 (金) 18:54:38
  • 「コードは現在以下のような状況」のソースで、4行にわたってecho()している部分(<br />とかそのものが書かれているところ)が不要です。それをコメントにするなり消すなりして、実行しないように変更してみてください。 -- 2010-06-18 (金) 20:24:58
  • echo()している部分を消して実行しましたが、結果は同じでした。 -- sato.is-tech? 2010-06-21 (月) 11:59:16
  • 質問箱/333, 質問箱/2201 -- 2010-06-21 (月) 17:32:17
  • 結果が同じということは、新しくダウンロードした分でもfilename:~が混ざったままって事? -- 2010-06-21 (月) 22:56:03
  • filename:~は混ざっていませんでしたが、文字化けな状況です。正確にお伝えできずすみませんでした。 -- sato.is-tech? 2010-06-22 (火) 11:04:55
  • バイナリエディタなどで、壊れている方と壊れていない方との差分をとってみるとか? -- 2010-06-22 (火) 11:22:03
  • WinMergeで比較したところ、Header部分とFooter部分に差分が見られましたが、目視では違いをみつけることができませんでした・・・ -- sato.is-tech? 2010-06-22 (火) 13:01:34
  • Header部分の違いは改行(バイナリエディタで表示した時、16進数の「0A」や「0D」)が余分についている状態ですか?もしそうなら、質問箱/4352などが参考になるかもしれません。 -- 2010-06-22 (火) 14:14:29
  • バイナリエディタやテキストエディタで確認するかぎりでは、改行の違いかどうかは判定できませんでした。 ご教授いただいた質問箱/4352にあるiniの改行が~という対象ファイルは、1.4.7版でいうところのja.lng.php,pukiwiki.ini.phpでしょうか?そちらの方の改行の状態を見る限りでは改行コードはLF,不要な改行は見当たりませんでした。 -- sato.is-tech? 2010-06-22 (火) 15:46:41
  • とりあえずバックアップして、pukiwikiを再インストールして添付ファイルをアップロードして、データを確認したところ正しく表示されました。しかしながら添付ファイルを日本語にするとダウンロード時にファイル名が文字化けしてしまいます。 -- sato.is-tech? 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? 2010-06-22 (火) 16:13:26
  • IE8,Chrome5,FireFox3,Safari5,Opera10.54にて動作確認したところ、IE8:○,Chrome5:○,FireFox3:×,Safari5:×,Opera10.54:×といった結果で文字化けの現状が確認できました。(○が文字化けしない、×が文字化けする)ファイル名の文字エンコード処理の部分をちょっと見直して改修してみます。 -- sato.is-tech? 2010-06-22 (火) 16:27:35
  • AttachFiles::open()の文字エンコード処理の部分を以下のような変更を加えたことにうまくできました。 -- sato.is-tech? 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;
		}
	}

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-06-22 (火) 18:03:19
Site admin: PukiWiki Development Team

PukiWiki 1.5.2+ © 2001-2019 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u7. HTML convert time: 0.270 sec.

OSDN