HttpPostedFile to stream = почему я не должен утилизировать stream?

#asp.net

#asp.net

Вопрос:

Я должен сохранить загруженное изображение на диске, но сначала я должен проверить, не имеет ли изображение ширины или высоты меньше 50 пикселей. Поскольку я знаю, что когда мы используем stream, мы должны утилизировать этот поток, поэтому я использую ‘using’ в методе проверки:

 public bool CheckDimensions(HttpPostedFile file)
{
    using (Stream stream = file.InputStream)
    {
        System.Drawing.Image image = System.Drawing.Image.FromStream(stream);

        if (image.PhysicalDimension.Width < 50 || image.PhysicalDimension.Height < 50)
        {
            return false;
        }

        return true;
    }
}
  

Но тогда я не могу сохранить изображение своим вторым методом, потому что длина содержимого файла HttpPostedFile равна 0. Когда я не использую инструкцию ‘using’, длина содержимого HttpPostedFile верна (> 0). Значит, в таком случае я не должен утилизировать stream?

Ответ №1:

Потому что file.InputStream это ссылка на загруженный файл. Удаление его с помощью using инструкции означает, что он удаляется везде, где на него также ссылаются / используются

Попробуйте

 using(Stream stream = file.InputStream)
{
   bool isRightSize = CheckDimensions(stream);
   ... other operations on the stream
}

public bool CheckDimensions(Stream stream)
{

        System.Drawing.Image image = System.Drawing.Image.FromStream(stream);

        if (image.PhysicalDimension.Width < 50 || image.PhysicalDimension.Height < 50)
        {
            return false;
        }

        return true;

}
  

Комментарии:

1. Спасибо — должны ли мы явно закрыть его, потому что на этом сайте: msdn.microsoft.com/en-us/library/system.web.httppostedfile.aspx у нас есть информация «Ресурсы сервера, которые выделены для буферизации загруженного файла, будут уничтожены по завершении запроса».

2. Я не думаю, что это связано. Я думаю, это означает, что при обратной публикации страницы файл больше не будет доступен, поэтому вам придется загрузить его снова или использовать SaveAs, чтобы сохранить его на диск для последующего использования