Image.FromStream(PostedFile.InputStream)は失敗します。 (パラメーターは無効です。)(AsyncFileUpload))
-
06-07-2019 - |
質問
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.
}
}
更新:交差管理境界の問題は逆方向でのみ発生し(応答ストリームを使用)、ストリームのアップロードでは発生しないようですが、完全にはわかりません。