dポイントプレゼントキャンペーン実施中!

ASP.NET、フレームワークは.net4.0環境です。。
FileUploadコンロールを使って、POSTした画像を保存するような
ものを作りたいと思っています。
FileUploadとButtonを設置して、以下のように書きました。
(C Sharpで書いたものです)

---
protected void Button1_Click(object sender, EventArgs e)
{
if (FileUpload1.HasFile)
{
//ファイルを保存
HttpPostedFile imageData = FileUpload1.PostedFile;
using (cbitmap = new Bitmap(imageData.InputStream))
{
int test = bitmap.Width;
bitmap.Save(@"C:\img_save\test.jpg", ImageFormat.Jpeg);
}
}
}
---

画像のサイズが小さい時はうまくいくのですが、2MB少々のjpg画像を上記で
投稿しようとしたところ、Saveの箇所で以下のようなエラーが出てしまいます。

--
ExternalExceptionがキャッチされました。
GDI+ で汎用エラーが発生しました。
--

FileUPLoadの上限は4MBだったと思いますが、2MB程度で上記のような
エラーが出てしまうのは何故でしょうか?
InputStreamから、Bitmapとしているため、そこで容量を超えてしまうとか
いうこともありますか…ね…?
最大3MBほどまでUP出来るようにしたいのですが、修正すべき点について
アドバイスいただけないでしょうか。

宜しくお願いします。

A 回答 (3件)

単純なHttpPostedFile.Saveではなく、Bitmapに変換して検証や操作を加えたうえで保存したい、ということならば、



HttpPostedFile.InputStreamは、MemoryStreamと違い、バッファリングをともなう入出力ストリームなので、あらかじめ正しく読み出してあげることが必要なのではないかと思います。
投稿を拝見した感じでは、宣言しただけである程度の読み込みが完了しているようですね。
それはそれでwow

protected void Button1_Click(object sender, EventArgs e){

if (FileUpload1.HasFile){
HttpPostedFile postedFile = FileUpload1.PostedFile;
byte[] buffer = new byte[postedFile.InputStream.Length];
postedFile.InputStream.Read(buffer, 0, postedFile.InputStream.Length);
// TODO:Bitmap生成
var bitmap = (System.Drawing.Bitmap)ImgConv.ConvertFrom(buffer);
// TODO:ファイルを保存
bitmap.Save(@"C:\img_save\test.jpg", ImageFormat.Jpeg);
}

}

連続して複数変換するときは、
postedFile.InputStream.Seek(0, SeekOrigin.Begin);
もわすれずに

この回答への補足

度々すみません。
以下コードでも同様のエラーとなってしまいました。

byte[] buffer = new byte[imageData.InputStream.Length];
imageData.InputStream.Read(buffer, 0, Convert.ToInt32(imageData.InputStream.Length));
ImageConverter ImgConv = new ImageConverter();
Bitmap bitmap2 = (System.Drawing.Bitmap)ImgConv.ConvertFrom(buffer);
bitmap2.Save(temp_path, ImageFormat.Jpeg);

補足日時:2014/07/04 13:56
    • good
    • 0
この回答へのお礼

詳しいご説明ありがとうございます。
imageData.InputStream.LengthがLong型で、引数として受け付けなかったので、とりあえずInt32でCastしたのですが、それで大丈夫でしょうか…あふれることもあるものですかね。

imageData.InputStream.Read(buffer, 0, Convert.ToInt32(imageData.InputStream.Length));

お礼日時:2014/07/04 13:41

Bitmap に展開してサイズを確認する件はわかりました。


確認が終わったら廃棄して、保存は FileUpdate で試してみましたか?
質問文では Bitmap の Save でエラーとなる旨が書かれてますよね。
    • good
    • 0

FileUpload コントロールを使ったことがないので的確な回答じゃないかもしれませんが、、、


一度 Bitmap に展開して保存する理由が不明ですが、FileUpload コントロールの SaveAs ではダメなのでしょうか?
何かセキュリティ的な対処の理由とか、質問文では省略した処理などがあって Bitmap に展開する必要があるのでしょうか。

この回答への補足

ご回答ありがとうございます。
省略してしまいましたが、width、heightのチェックをする必要がありまして、
一度画像として展開しています。

補足日時:2014/07/02 17:46
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!