无论如何,我正在尝试从浏览器上传文件,然后将其读入服务器上的XmlDocument对象。最初我通过将文件保存到磁盘,将其读入XmlDocument对象然后删除文件来解决此问题。唯一的问题是删除操作是在XmlDocument.Load
操作完成之前尝试进行的。
无论如何,这感觉就像一个丑陋的解决方案,所以很高兴放弃它。
接下来的努力是直接从Request.Files[x].InputStream
直接读到XmlDocument,但我遇到了问题。
以下代码失败,带有
'根元素缺失'
我知道XML是有效的,所以它必须是别的东西。
foreach (string file in Request.Files)
{
HttpPostedFileBase postedFile = Request.Files[file] as HttpPostedFileBase;
if (postedFile.ContentLength > 0) //if file not empty
{
//create an XML object and load it in
XmlDocument xmlProjPlan = new XmlDocument();
Stream fileStream = postedFile.InputStream;
byte[] byXML = new byte[postedFile.ContentLength];
fileStream.Read(byXML, 0, postedFile.ContentLength);
xmlProjPlan.Load(fileStream);
}
}
答案 0 :(得分:9)
以下是一个例子:
<% using (Html.BeginForm("index", "home", FormMethod.Post, new { enctype = "multipart/form-data" })) { %>
<input type="file" name="file" />
<input type="submit" value="Upload" />
<% } %>
控制器动作:
[HttpPost]
public ActionResult Index(HttpPostedFileBase file)
{
if (file != null && file.ContentLength > 0 && file.ContentType == "text/xml")
{
var document = new XmlDocument();
document.Load(file.InputStream);
// TODO: work with the document here
}
return View();
}
答案 1 :(得分:4)
所以有些事情看起来不对。
fileStream.Read(byXML, 0, postedFile.ContentLength);
这一行将文件读入byXML字节缓冲区,但是你以后没有使用这个字节缓冲区,所以我认为你的意思是删除这一行或者使用byXML缓冲区来代替你的XmlDocument.Load()
不幸的是,这条线路将您的信息流推进到最后,所以当您致电
时xmlProjPlan.Load(fileStream);
它没有任何结果,因为流已经结束了。这可能就是它无法找到根元素的原因。