Это правильно, это не будет работать. Проблема в том, что вы пересекаете управляемую / неуправляемую границу, я недавно столкнулся с тем же. Другие проблемы заключаются в том, что поток не находится прямо там, и Image.FromStream не знает, как с ним справиться.
Решение довольно простое: прочитайте все из PostedFile в MemoryStream (просто используйте new MemoryStream()
) и используйте MemoryStream с Image.FromStream
. Это решит вашу проблему.
Обязательно правильно используйте using
при работе с Image
, Graphics
и Stream
с. Все они реализуют 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.
}
}
Обновление: проблема с пересечением управляемой границы возникает только в обратном направлении (с использованием потока ответов), кажется, не с потоками загрузки, но я не совсем уверен.