10

流来自通过 ajax 的 html 表单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 语句,以便消除 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有一个文件路径的实现,所以 WordprocessingDocument.Open(path);希望你明白我为未来有问题的人做了什么。

4

4 回答 4

6

您正在做的是自找麻烦,因为请求流可能尚未完全下载。

我建议您先将文件下载到 MemoryStream 中或作为文件下载,请参阅此处了解后一种选项,然后对上传的文件执行任何操作。

于 2013-07-26T18:10:56.597 回答
3

我猜该流没有通过读或读写访问正确打开。

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

IOException:当“流”未通过读取 (ReadWrite) 访问打开时引发。

于 2013-07-26T19:29:22.733 回答
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

于 2013-07-26T19:35:45.803 回答
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被释放后流可用。

于 2018-11-22T20:46:03.063 回答