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);

...
}

Еще одна вещь, которую я нахожу странной: если я попробую изображение размером менее 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.
    }
}

Обновление: проблема с пересечением управляемой границы возникает только в обратном направлении (с использованием потока ответов), кажется, не с потоками загрузки, но я не совсем уверен.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top