2013-02-12 3 views
4

контроллера:C# BinaryReader не удается получить доступ к закрытому файлу

private readonly Dictionary<string, Stream> streams; 

     public ActionResult Upload(string qqfile, string id) 
     { 
      string filename; 
      try 
      { 
       Stream stream = this.Request.InputStream; 
       if (this.Request.Files.Count > 0) 
       { 
        // IE 
        HttpPostedFileBase postedFile = this.Request.Files[0]; 
        stream = postedFile.InputStream; 
       } 
       else 
       { 
        stream = this.Request.InputStream; 
       } 

       filename = this.packageRepository.AddStream(stream, qqfile); 
      } 
      catch (Exception ex) 
      { 
       return this.Json(new { success = false, message = ex.Message }, "text/html"); 
      } 

      return this.Json(new { success = true, qqfile, filename }, "text/html"); 
     } 

метод для добавления потока:

 public string AddStream(Stream stream, string filename) 
     { 

      if (string.IsNullOrEmpty(filename)) 
      { 
       return null; 
      } 

      string fileExt = Path.GetExtension(filename).ToLower(); 
      string fileName = Guid.NewGuid().ToString(); 
      this.streams.Add(fileName, stream); 
     } 

Я пытаюсь прочитать двоичный поток таким образом:

Stream stream; 
      if (!this.streams.TryGetValue(key, out stream)) 
      { 
       return false; 
      } 

    private const int BufferSize = 2097152; 

          using (var binaryReader = new BinaryReader(stream)) 
          { 
           int offset = 0; 
           binaryReader.BaseStream.Position = 0; 
           byte[] fileBuffer = binaryReader.ReadBytes(BufferSize); // THIS IS THE LINE THAT FAILS 
    .... 

Когда Я просматриваю поток в режиме отладки, он показывает, что его можно прочитать = true, seek = true, длина = 903234 и т. Д.

, но я получаю: не удается получить доступ к закрытому файлу

Это прекрасно работает, когда я запускаю MVC сайт локально/режим отладки (VS IIS) и не работаю в режиме «RELEASE» (когда сайт опубликовано в iis).

что я делаю неправильно?

+1

Пожалуйста, покажите, где/как 'определяется stream'. –

+0

добавлен контроллер и метод addstream – ShaneKm

ответ

7

Найдено решение здесь:

uploading file exception

Решение:

добавить "requestLengthDiskThreshold" по производству envirenment

<system.web> 
<httpRuntime executionTimeout="90" maxRequestLength="20000" useFullyQualifiedRedirectUrl="false" requestLengthDiskThreshold="8192"/> 
</system.web> 
+0

shane! Я также сталкиваюсь с этой ошибкой, где бы я добавил это? в файле веб-конфигурации? в производственной среде? спасибо :) – user2705620

+0

в вашем файле web.config между статья – ShaneKm

+0

спасибо @shane :) уже решили это этим :) – user2705620

0

Казалось бы, вы полагаетесь на время жизни объекта, который вы не контролируете (свойства объекта HttpRequest). Если вы хотите хранить данные потока, было бы безопаснее, чтобы скопировать эти данные непосредственно в массив байтов или аналогичный

можно изменить AddStream к

public string AddStream(Stream stream, string filename) 
    { 

     if (string.IsNullOrEmpty(filename)) 
     { 
      return null; 
     } 

     string fileExt = Path.GetExtension(filename).ToLower(); 
     string fileName = Guid.NewGuid().ToString(); 
     var strLen = Convert.ToInt32(stream.Length); 
     var strArr = new byte[strLen]; 
     stream.Read(strArr, 0, strLen); 
     //you will need to change the type of streams acccordingly 
     this.streams.Add(filename,strArr); 
    } 

, то вы можете использовать массив, если вам нужно данные потока, который дает вам полный контроль над временем жизни объекта, данные хранятся в

Смежные вопросы