Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 434
hidden Avatar asked Jul 26 '13 18:07

hidden


3 Answers

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.

like image 187
Sten Petrov Avatar answered Nov 15 '22 19:11

Sten Petrov


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.

like image 37
Chris Avatar answered Nov 15 '22 18:11

Chris


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

like image 32
Michael Gunter Avatar answered Nov 15 '22 19:11

Michael Gunter