WordPressで大きいサイズのファイルをアップロードできない

WordPressでファイルサイズの大きいもの(スキャンされたPDFで、ファイルサイズは8Mぐらい)をアップロードしようとしたらエラーがでた。エラーメッセージは下記

This file is too big. Your php.ini upload_max_filesize is 2000M.

アップロードに失敗したスクリーンショット

ファイルサイズが8Mに対してphp.iniのupload_max_filesizeの設定値は2GBだから明らかに挙動不審。

バージョンが低いせいなのかなー、とも思うけど、コードを軽く追っかけるとよくわかんなかったので、楽に解決できるよう

1. 似たようなPDFをアップロード

2. さらに実際にアップしたいファイルを直接アップロード

3. ファイルのURLをDBをいじくって直接書き換え

という手法を選択。attachmentってどうなってるかとか全然知らないし、いい機会かなと。

1, 2は難なくできるんだけど、3の対象となるデータが見つからず苦労。

昔のバージョンだとpostmetaあたりを盛大に利用していた覚えがあったので見てみるけどわからず。現在ではattachmentもpostの一部としてとらえ、ユニークなIDが割り当てられる。そしてその詳細が(wp_)postsに書き込まれる。

てっきりここにファイルの場所を指し示すURLがあるのかと思いきや、それらしき箇所はguidのみ。guidは

GUID (Globally Unique Identifier)またはグローバル一意識別子(ぐろーばるいちいしきべつし)は、ソフトウェアで使用される擬似乱数で、世界で一意な識別子として使用される128ビットの2進数値である。ただし、絶対に一意であることを保証するものではなく、生成される識別子の数が(2128 つまり 3.40282366×1038) と非常に大きいため、同じ識別子が生成される確率がきわめて小さいということである。GUIDは『グーイッド』と発音する (wikipedia)

って感じのものっぽい。文字列だけど。

ここを書き換えたけどうまくいかず、しょうがないのでソースを見てみる。

media.phpのL973で

$image_url = wp_get_attachment_url($post->ID);

ってしてる。これがくさいからこの関数を調べると、適当に抜き出して

if ( $file = get_post_meta( $post->ID, ‘_wp_attached_file’, true) ) {

$url = str_replace($uploads[‘basedir’], $upload\
s[‘baseurl’], $file);

してる。(wp_)postmetaからIDが同じやつでkeyが”_wp_attached_file”な行に書いてあるらしい。そんで最終的にこれが見つからなかったら先ほどのguidを利用するらしい。なーんだ。postmetaを見る目が甘かったです。見落としてました。

結局このmeta_valueを書き換えてやれば難なくアップロードされたファイルのすり替えが完了しました。

こんな回り道するならバグっぽいのを潰して報告してやれよって思ったのですが、最新を追っかけるのと報告が面倒で・・・。

以上。

コメントを残す