2010/03/22

MapPath()とBitmap.Save()の挙動不審

二つのメソッドの挙動不審が重なって、深胃落とし穴にはまり、連休が飛びました。


事の発端は、在る画像をUploadしたあと、サイズ調整して、指定のフォルダーに格納するという単純なWebアプリです。

VS2008のIDEで開発Webサーバーで稼働確認して、順調だったので、本番機に移行したところ。

「GDI+ で汎用エラーが発生しました」と出て落ちる。



GDI+は癖の強いモジュールです。

同名のFileに上書きするときにも、同様のエラーがでます。(*)適切な例外メッセージにならんのか..www

.save直前に、該当Fileを消すようにしてます。

Image.FromFile(file) を実行すると、Fileがロックされ、次のステップの Image.save(file) で、同様のメッセージがでます。

なまじ、そのことを知っていたのが仇となり、MemoryStram上で展開して、saveしてみたが、同様に落ちる。

Folder/File名に漢字があると不味い、とかいろいろ怪しげな情報も転がっていますがどれも該当しそうにない。

メモリーリークなのかと、思いましたが、どうも違う。



該当箇所は、image.save(MapPath("./images/該当FILE.JPG")); です。問題ない....として他を検討していましたが、念のため

string str = MapPath("./該当FILE.JPG");

[debug.確認] =>LogFileに書き出し。

image.save(str);



と変えて、 [debug.確認]の箇所で、 str値を確認しました。

なんと。

開発Webサーバーの下では 「d:\WebApli\client\xxxx\images\該当FILE.JPG」 となっていて、問題なく動作します

本番機の元では「d:\WebApli\images\該当FILE.JPG」と存在しない値にり、落ちます。



MapPath()の "./"の解釈が"~/"と同値になっているのかなぁ。 開発Webサーバーと通常サーバで解釈が異なるのも釈然としません。

"./"をとっても、デフォルトFolderの解釈がことなるようです。

image.save(MapPath("~/client/xxxx/images/該当FILE.JPG")); と アプリルートから指定にすれば、上手く動作します。



*.aspx/*.html のデフォルトパスの認識は、.net言語, Javascriptでも差違がありますし、CSS,includeの指定の仕方でも異なります。

include先のフォルダーに基準が変わることもあり、ヤヤコシイことこの上ない。

しかし、開発Webサーバーと本番サーバで結果が異なるのは、納得できないなぁ。

0 件のコメント:

コメントを投稿