OpenXml无法打开包,因为FileMode或FileAccess值对流无效

时间:2013-07-26 18:05:38

标签: c# openxml openxml-sdk

该流来自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值无效   对于流。

我google 无法打开包,因为FileMode或FileAccess值对流无效但找不到任何有用的内容。有什么想法吗?

PS:最初我简化了要在这里发布的代码。添加了if语句,以便消除Sten Petrov的担忧。我希望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有一个filepath实现 WordprocessingDocument.Open(path);希望你了解我为有问题的未来人做了些什么。

4 个答案:

答案 0 :(得分:4)

您正在做的是提出问题,因为请求流可能尚未完全下载。

我建议您首先将文件下载到MemoryStream中,或者作为文件see here下载后一个选项,然后对上传的文件执行任何操作。

答案 1 :(得分:3)

我猜这个流没有使用read或readwrite访问权限正确打开。

MSDN关于WordprocessingDocument.Open方法(Stream,Boolean)

  

IOException的:   使用Read(ReadWrite)访问权限打开“stream”时抛出。

答案 2 :(得分:2)

方法WordprocessingDocument.Open定义为:

public static WordprocessingDocument Open(Stream stream, bool isEditable)

您传递readStream.CanRead的值作为第二个参数。这对我来说似乎不正确。当CanReadtrue时,表示可以读取流,您尝试将WordprocessingDocument打开为可编辑状态,而流可能不支持。我只会传递false作为第二个参数。否则,传递readStream.CanWrite,但如果此属性始终返回false(正如我在处理上传文件中的流时所期望的那样),请不要感到惊讶。

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

答案 3 :(得分:0)

我遇到了同样的问题,但是使用了 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 后流可用。