一部の画像ファイルをアップロードできない

date:2013-04-20
status:close
type:bug

結論

ftputilの不具合により画像が正しくアップロードされていませんでした。 画像についてはftplibを使ってアップロードするように変更しました。 ファイルサイズが大きいとダウンロード時間も多くなり FTPサーバのファイルサイズ制限(500KB以下でなければならない)もあるので bmpjpg に変換し、ファイルサイズを小さくするように変更しました。 以降 bmp がリポジトリに登録されることがないように .hgignore にエントリを追加しました。 既に登録されている bmp に関しては削除して 代わりに変換した jpg を登録しました。

内容

ロゴに使用していた /_static/image.png の画像が正しく表示されていません。 ブラウザで表示してみると 破損している と言われます。

そこでweb上のファイルサイズを確認したところ 5KB しかありませんでした。 途中までアップロードされた中途半端な状態になっているようでした。 このサイトのファイルをデプロイしているサーバにはファイルサイズに制限があり、 500KBとなっているためそれより大きいファイルはアップロードできません。

とりあえずサイズが500KBより大きいファイルをリストアップしました。:

$ _script\check_file_size.py
 2446902: _static/squid_download_page.bmp
 2956854: _static/blender/create_charactor.bmp
 2956854: _static/blender/create_donjon.bmp
 2956854: _static/blender/setting_collision.bmp
 2055186: _lib_/plantuml.jar

対象となるファイルは含まれていません。 サイズも確認してみましたが、7KB程度しかありませんでした。:

$ ls -l _static/image.png
-rw-rw-rw-   1 user     group        7284 Apr 16 07:52 _static/image.png

そこでFTPクライアントを別のものにして再度アップロードしてみたところ 画像が正しくアップロードされました。

どうやらftpクライアントが原因のようです。 よく見ると一発失敗したファイルがあるとそれ以降は失敗するようです。 リターンコードは 10054 が返されていました。 10054 はサーバ側から強制的に切断された時のコードです。 画像は強制的に圧縮したほうがいいかもしれません。

画像圧縮スクリプト

make upload の前に _build_/dirhtml 配下のファイルを走査して 500KB より大きな画像ファイルを圧縮します。 対象となるファイルは bmp png gif jpg とします。 圧縮後のサイズは 500KB以下とします。 出力ファイルパスは圧縮前のものと同じパスとします。

圧縮サイズが目標に到達しない場合、出力ファイルが書き出せない場合は make upload を停止し、エラーを出力します。

--force が指定されたら強制的にアップロードを実行します。

とりあえず bmpjpg に変更するスクリプトを作成しました。 サムネイルを生成 にページを追加します。

画像サイズを小さくしても正しくアップロードされず

サムネイルを生成 に記載しているファイルを使用して ファイルサイズを500KB以下にしました。 その後アップロードを試してみましたが、現象はかわりませんでした。

そこでftputilの使用をやめてftplibを使用してアップロードしてみました。 ファイルは正しくアップロードできていました。 ftputilで画像が正しくアップロードできない を新しく発行しました。

どうやらftputilのバグのようです。

ノート

ftputilの使い方が間違っていることが原因でした。 詳しくは ftputilで画像が正しくアップロードできない をご覧ください。

inserted by FC2 system