hidden
hidden

Reputation: 3236

OpenXml Cannot open package because FileMode or FileAccess value is not valid for the stream

The stream comes from an html form via 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);
 }
}

I get this error:

Cannot open package because FileMode or FileAccess value is not valid for the stream.

I google Cannot open package because FileMode or FileAccess value is not valid for the stream but can't find anything useful. Any ideas?

PS: Initially I simplified the code to be posted here to much. Added the if statement so that it would erase the concern by Sten Petrov. I hope Request.File.count>0 does address his concern... I still have the same problem...

UPDATE

As a work around I followed the advise below and save the file to a directory then I use openxml to read it from the directory

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

then WordprocessingDocument.Open has a implementation for filepath so WordprocessingDocument.Open(path); hope you get the idea of what I did for future people that have problems.

Upvotes: 12

Views: 11343

Answers (4)

Diomos
Diomos

Reputation: 430

I had same issue but with ClosedXML.Excel library. I was downloading file using simple WebRequest instance and I my problem was that Stream got closed with WebRequest disposal so I had to copy it. For the "safety" I used MemoryStream.

MemoryStream memStream = new MemoryStream();

using (WebResponse response = request.GetResponse())
{
     response.GetResponseStream()?.CopyTo(memStream);
}

XLWorkbook workbook = new XLWorkbook(memSream);

CopyTo is to ensure stream is available after WebRequest is disposed.

Upvotes: 1

Michael Gunter
Michael Gunter

Reputation: 12811

The method WordprocessingDocument.Open is defined as:

public static WordprocessingDocument Open(Stream stream, bool isEditable)

You're passing the value of readStream.CanRead as the second parameter. This doesn't seem correct to me. When CanRead is true, indicating that the stream can be read, you're trying to open the WordprocessingDocument as editable, which the stream probably doesn't support. I would just pass false for the second parameter. Otherwise, pass readStream.CanWrite but don't be surprised if this property always returns false (as I would expect when dealing with streams from uploaded files).

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

Upvotes: 2

Chris
Chris

Reputation: 8647

I guess the stream is not correctly opened with read or readwrite access.

From MSDN about WordprocessingDocument.Open method (Stream, Boolean)

IOException: Thrown when "stream" is not opened with Read (ReadWrite) access.

Upvotes: 3

Sten Petrov
Sten Petrov

Reputation: 11040

What you're doing is asking for trouble, because the Request stream may not have fully been downloaded.

I suggest you download the file first into a MemoryStream or as a file, see here for the latter option, then do whatever you want to the uploaded file.

Upvotes: 6

Related Questions