Хобрук: Ваш путь к мастерству в программировании

OpenXml Не удается открыть пакет, поскольку значение FileMode или FileAccess недопустимо для потока

Поток приходит из html формы через ajax var jqXHR = data.submit();

public static GetWordPlainText(Stream readStream,string filePath)
{
   WordprocessingDocument.Open(readStream, readStream.CanRead);
}
[HttpPost]
public ActionResult FileUpload() 
{
 var MyFile = Request.Files[0];
 if (Request.Files.Count > 0 && MyFile != null)
 {
  GetWordPlainText(Request.InputStream);
 }
}

Я получаю эту ошибку:

Не удается открыть пакет, так как значение FileMode или FileAccess недопустимо для потока.

Я гуглю Не могу открыть пакет, потому что значение FileMode или FileAccess недействительно для потока, но не могу найти ничего полезного. Любые идеи?

PS: Изначально я сильно упростил код для размещения здесь. Добавлен оператор if, чтобы стереть беспокойство Стена Петрова. Я надеюсь, что Request.File.count>0 решит его проблему... У меня все та же проблема...

ОБНОВИТЬ

В качестве обходного пути я последовал приведенному ниже совету и сохранил файл в каталоге, а затем использовал openxml, чтобы прочитать его из каталога.

  var MyFile = Request.Files[0];
  var path = Path.Combine(Server.MapPath("~/App_Data/temp"), MyFile.FileName);
                using (MemoryStream ms = new MemoryStream())
                {
                    //if file exist plz!!!! TODO

                    Request.Files[0].InputStream.CopyTo(ms);
                    System.IO.File.WriteAllBytes(path, ms.ToArray());
                }

затем WordprocessingDocument.Open есть реализация пути к файлу, так что WordprocessingDocument.Open(path); надеюсь, вы поняли, что я сделал для будущих людей, у которых возникнут проблемы.

26.07.2013

Ответы:


1

То, что вы делаете, напрашивается на неприятности, потому что поток запросов, возможно, не был полностью загружен.

Я предлагаю вам сначала загрузить файл в MemoryStream или в виде файла, см. здесь последний вариант, а затем делайте все, что хотите, с загруженным файлом.

26.07.2013

2

Я предполагаю, что поток неправильно открыт с доступом для чтения или записи.

Из MSDN о методе WordprocessingDocument.Open (поток, логическое значение)

IOException: вызывается, когда «поток» не открыт с доступом для чтения (ReadWrite).

26.07.2013
  • Я рассмотрю это возможное решение. Ведь я сделал то, что рекомендовал Петров. 27.07.2013

  • 3

    Метод WordprocessingDocument.Open определяется как:

    public static WordprocessingDocument Open(Stream stream, bool isEditable)
    

    Вы передаете значение readStream.CanRead в качестве второго параметра. Это не кажется мне правильным. Когда CanRead равно true, что указывает на возможность чтения потока, вы пытаетесь открыть WordprocessingDocument как редактируемый, что поток, вероятно, не поддерживает. Я бы просто передал false для второго параметра. В противном случае передайте readStream.CanWrite, но не удивляйтесь, если это свойство всегда возвращает false (как и следовало ожидать при работе с потоками из загруженных файлов).

    http://msdn.microsoft.com/en-us/library/office/cc536138.aspx

    26.07.2013
  • WordprocessingDocument.open имеет несколько перегрузок, одна из которых — stream, bool. Тем не менее, я попытаюсь установить для него значение false и дам вам знать, смог ли я использовать поток вместо неудачной записи в файл, а затем использовать строковую перегрузку WordprocessingDocument.open. 27.07.2013
  • Извините, да. Я хотел опубликовать сигнатуру метода (Stream, bool) и ошибся. Просто исправил это. Я пытался подчеркнуть, что когда вторым параметром этого метода является true, он требует, чтобы базовый поток был редактируемым, а ваш загруженный поток — нет. 27.07.2013

  • 4

    У меня была такая же проблема, но с библиотекой ClosedXML.Excel. Я загружал файл, используя простой экземпляр WebRequest, и моя проблема заключалась в том, что Stream был закрыт с удалением WebRequest, поэтому мне пришлось его скопировать. Для «безопасности» я использовал MemoryStream.

    MemoryStream memStream = new MemoryStream();
    
    using (WebResponse response = request.GetResponse())
    {
         response.GetResponseStream()?.CopyTo(memStream);
    }
    
    XLWorkbook workbook = new XLWorkbook(memSream);
    

    CopyTo обеспечивает доступность потока после удаления WebRequest.

    22.11.2018
    Новые материалы

    Обнаружение маски или без маски с YOLO😷
    Это руководство по созданию пользовательской модели обнаружения объектов для обнаружения людей, носящих или не носящих маски в общественных местах, созданной с использованием YOLO v3. Модель..

    Управление приборами в чистом PHP
    Этот пост дополняет эти: E2e тестирование Работа с несколькими средами . Мы разработали это решение для базы данных MariaDB, оно может отличаться, если вы используете другую базу..

    Неделя 1 — Кентерберийские рельсы.
    Неделя 1 — Кентерберийские рельсы. So. Мы все еще живы, все еще усердно работаем и еще не пассивно-агрессивно рассылаем друг другу сообщения «за мое последнее сообщение в Slack…», поэтому, на..

    Цена завтрашнего дня  — Джефф Бут
    Технологический прогресс в наши дни происходит с молниеносной скоростью, и мы не в состоянии это понять. Джефф в основном говорит о влиянии технологий на экономику по всему миру. Он твердо верит..

    Данные: суперсила современного бизнеса
    В цифровой среде данные превратились из простого побочного продукта бизнес-операций в центральный актив, стимулирующий рост и инновации. Крейг Манди, бывший главный директор по стратегии..

    Как симулировать серию пенальти на Python с помощью симуляции Монте-Карло, часть 1: генерация функций
    Серия пенальти была огромным испытанием во время чемпионата мира по футболу. Они вызвали много споров в социальных сетях и новостных агентствах. Даже финальный матч турнира решался по..

    AST для разработчиков JavaScript
    TL; DR Эта статья - мое выступление на недавно состоявшейся конференции Stockholm ReactJS Meetup. Вы можете посмотреть слайды здесь..