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);
...
}
Еще одна вещь, которую я нахожу странной: если я попробую изображение размером менее 80 КБ, это сработает ..!
Мы попытались перезапустить сервер, но без изменений. Тот же код отлично работает на моей машине. (слышал что раньше ?? :))
Я также пытался сохранить файл на сервере, а затем получить файл через Image.FromFile (), но затем получаю " Невозможно получить доступ к закрытому файлу. "
Как решить эту проблему?
Решение
Я бы позаботился о том, чтобы поток располагался в начале:
var file = AsyncFileUpload1.FileContent;
file.Seek(0, SeekOrigin.Begin);
var img = Image.FromFile(file);
Второе, что нужно проверить: requestLengthDiskThreshold
настройка. Если не указано иное, по умолчанию для этого параметра установлено значение ... да, 80 КБ.
Примечание. В целом, не должно быть никакой разницы, используете ли вы Image для непосредственного чтения потока файлов или если вы используете промежуточный MemoryStream (кроме того факта, что в последнем случае вы действительно загружаете весь файл в память дважды). В любом случае исходный файловый поток будет считан, таким образом, положение потока, права CAS, права доступа к файлу и т. Д. Все еще применяются.
Примечание 2: и да, обязательно убедитесь, что эти ресурсы расположены правильно :)
Другие советы
Это правильно, это не сработает. Проблема в том, что вы пересекаете управляемую / неуправляемую границу, я недавно столкнулся с тем же. Другие проблемы заключаются в том, что потока нет непосредственно, и 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.
}
}
Обновление: проблема с пересечением управляемой границы возникает только в обратном направлении (с использованием потока ответов), кажется, не с потоками загрузки, но я не совсем уверен.