WordPressのDownload MonitorでDLしたファイルが破損した問題のメモ
WordPressのプラグイン「Download Monitor」で管理しているファイルをダウンロードすると、ダウンロードしたファイルが破損していた。
その時の忘備録的なメモ
本来1MBぐらいあるはずのファイルがこのように小さなファイルサイズになってて開くこともできない。
3.86kbってのはディスク上の最小サイズの単位っぽい
PHPのエラーは出力されないし、類似しているプラグイン「WordPress Download Manager」や「Delightful Downloads」でも同様の症状だった。
新規インストールしたばかりのWordPressでも同様だったので、サーバーとの相性が悪いのかもしれない。
そうだとしたら今お借りしてるサーバーは共有サーバー(freeweb無料版)なので、php.ini の設定等色々弄れないから困った。
「Download Monitor」ver1.6.4 のソースを見てみることにした。
パスは「 (WordPressのルートディレクトリ)/wp-content/plugins/download-monitor/includes/ 」
ダウンロードを記述しているのは「 class-dlm-download-handler.php 」の380行目あたりからっぽい
380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 |
$headers = array(); if ( $is_IE && is_ssl() ) { // IE bug prevents download via SSL when Cache Control and Pragma no-cache headers set. $headers['Expires'] = 'Wed, 11 Jan 1984 05:00:00 GMT'; $headers['Cache-Control'] = 'private'; } else { nocache_headers(); } $headers['X-Robots-Tag'] = 'noindex, nofollow'; $headers['Content-Type'] = $mime_type; $headers['Content-Description'] = 'File Transfer'; $headers['Content-Disposition'] = "attachment; filename=\"{$file_name}\";"; $headers['Content-Transfer-Encoding'] = 'binary'; if ( $version->filesize ) { $headers['Content-Length'] = $version->filesize; $headers['Accept-Ranges'] = 'bytes'; } $headers = apply_filters( 'dlm_download_headers', $headers, $file_path, $download, $version ); foreach ( $headers as $key => $value ) { header( $key . ': ' . $value ); } |
何が問題あるのかわからないけど、ここのHTTPヘッダ送信が上手くいってない模様。
「 $headers[‘Content-Length’] 」のところでファイルサイズが指定できていないのだろうか。
個人的には小さいサイズのzipファイルしかアップロードする予定はないし、パスワードとかも使わないので、アップロードしたファイルにリダイレクトしてくれればそれでよかった。
なので403行目の
403 404 405 |
foreach ( $headers as $key => $value ) { header( $key . ': ' . $value ); } |
これを
403 404 405 406 407 408 409 410 411 |
/* foreach ( $headers as $key => $value ) { header( $key . ': ' . $value ); } */ // ↓追加 $file_path = str_replace( ABSPATH, site_url( '/', 'http' ), $file_path ); header( 'Location: ' . $file_path ); // 追加終わり |
このようにコメントアウトして、代わりにLocationヘッダでダウンロードファイルにリダイレクトするように追加した。
強引な方法だけど、とりあえずダウンロードしたファイルは正常になった。
最近のコメント