Image.FromStream(PostedFile.InputStream)は失敗します。 (パラメーターは無効です。)(AsyncFileUpload))

StackOverflow https://stackoverflow.com/questions/1614773

質問

AsyncFileUpload(AJAX Toolkit)を使用して画像をアップロードしています。 画像のサイズ変更を処理するボタンがあります。 これはしばらくの間はうまくいきましたが、もううまくいきません...

protected void BtnUploadImage_Click(object sender, EventArgs e)
{
    var imageFileNameRegEx = new Regex(@"(.*?)\.(jpg|jpeg|png|gif)<*>quot;, 
        RegexOptions.IgnoreCase);
    if (!AsyncFileUpload1.HasFile || 
        !imageFileNameRegEx.IsMatch(AsyncFileUpload1.FileName))
    {
        AsyncFileUpload1.FailedValidation = true;
        ErrorLabel.Visible = true;
        return;
    }
    ErrorLabel.Visible = false;

    var file = AsyncFileUpload1.PostedFile.InputStream;

    var img = Image.FromStream(file, false, false);

...
}

私がおかしいと思う別のこと:80kbより小さい画像を試してみると、うまくいきます。

サーバーを再起動しようとしましたが、変更はありません。 私のマシンでも同じコードが正常に動作します。 (前に聞いたことがある?? :))

ファイルをサーバーに保存してからImage.FromFile()経由でファイルを取得しようとしましたが、「閉じたファイルにアクセスできません」というメッセージが表示されます

これを解決する方法

役に立ちましたか?

解決

ストリームが開始位置にあることを確認します:

var file = AsyncFileUpload1.FileContent;
file.Seek(0, SeekOrigin.Begin);

var img = Image.FromFile(file);

確認する2番目の事項: requestLengthDiskThreshold 設定。指定しない限り、この設定のデフォルトは...はい、80 KBです。

注: imoファイルストリームを直接読み取るためにImageを使用する場合でも、中間MemoryStreamを使用する場合でも、全体的な違いはないはずです(後者の場合、実際にファイル全体をメモリに2回)。どちらの方法でも元のファイルストリームが読み取られるため、ストリームの位置、CASの権利、ファイルのアクセス許可などが引き続き適用されます。

注2:そして、はい、必ずこれらのリソースが適切に処理されるようにしてください:)

他のヒント

これは正しい、動作しません。問題は、管理対象/管理対象外の境界を越えているということです。最近、同じ問題に遭遇しました。他の問題は、ストリームが直接そこになく、Image.FromStreamがそれを処理する方法を知らないことです。

ソリューションは非常に簡単です。PostedFileからMemoryStreamにすべてを読み込み( new MemoryStream()を使用)、 Image.FromStream でMemoryStreamを使用します。これで問題が解決します。

Image Graphics 、および Stream を使用する場合は、 using を適切に使用してください。それらはすべて、IDisposableを実装し、ASP.NET環境で、 using ブロックを適切に使用していないため、メモリ使用量の増加や、長期的に(およびASP.NETアプリでのその他の厄介な副作用を引き起こす可能性があります。非常に長く実行してください!)。

ソリューションは次のようになります。

using(Stream memstr = new MemoryStream())
{
    // copy to a memory stream
    Stream uploadStream = AsyncFileUpload1.PostedFile.InputStream;
    byte[] all = new byte[uploadStream.Length];
    uploadStream.Read(all, 0, uploadStream.Length);
    memstr.Write(all, 0, uploadStream.Length);
    memstr.Seek(0, SeekOrigin.Begin);
    using(Graphics g = Graphics.FromStream(memstr))
    {
         // do your img manipulation, or Save it.
    }
}

更新:交差管理境界の問題は逆方向でのみ発生し(応答ストリームを使用)、ストリームのアップロードでは発生しないようですが、完全にはわかりません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top