无法正确读取 IFormFile 的文件内容
Failing to correctly read file contents of IFormFile
我有一个网络表单,它只是一个文件输入,用户可以在其中提交 xml 文件,这些文件将发送到我的 API。
我在尝试将这些文件读入 Xml 文档时遇到了问题。我以字符串的形式正确获取了内容,但是当将其加载到我的 xml 文件中时,我收到一条错误消息,指出语法不正确(尽管它看起来与我的原始文件中的一样)。
我尝试了多种不同的方法来从我的 IFormFile 中获取内容,但每种方法似乎都给我同样的问题。
控制器:
public ActionResult ReadFiles()
{
IFormFileCollection selectedFiles = Request.Form.Files;
MemoryStream ms = new MemoryStream();
List<IFormFile> fileList = selectedFiles.ToList();
string[] fileNames = fileList.Select(x => x.FileName).ToArray();
int i = 0;
RestRequest request = new RestRequest(Method.POST);
RestClient client = new RestClient("-EndPoint-");
request.AlwaysMultipartFormData = true;
request.AddHeader("Content-Type", "multipart/form-data");
foreach (IFormFile file in fileList)
{
file.CopyTo(ms);
request.AddFile("components", ms.ToArray(), fileNames[i]);
i++;
}
IRestResponse response = client.Execute(request);
}
在我的 API 中,我尝试了各种方法:
尝试#1
[HttpPost]
public string Checks(IFormFileCollection components)
{
XmlDocument xmlFile = new XmlDocument();
string[] arrFileNames = components.Select(x => x.FileName).ToArray();
int fileNameCounter = 0;
MemoryStream ms = new MemoryStream();
List<IFormFile> fileList = components.ToList();
foreach (IFormFile file in fileList)
{
using (MemoryStream fileStream = new MemoryStream())
{
file.CopyTo(fileStream);
byte[] bytes = fileStream.ToArray();
string xmlString = Encoding.UTF8.GetString(bytes);
xmlFile.Load(xmlString);
//Do Work
}
尝试 #2
StringBuilder xaml = new StringBuilder();
using (var reader = new StreamReader(file.OpenReadStream()))
{
while (reader.Peek() >= 0)
xaml.AppendLine(reader.ReadLine());
}
string xamlString = xaml.ToString();
xmlFile.Load(xamlString);
//Do Work
}
尝试 3
XmlDocument xml = new XmlDocument();
using (MemoryStream ms = new MemoryStream())
{
fileList[0].CopyTo(ms);
xml.Load(Encoding.UTF8.GetString(ms.ToArray()));
}
我尝试的所有其他方法似乎都会导致我遇到同样的问题。当我调试代码时,字符串与我的完整 xml 文件是正确的:
Debug String
但是当我尝试加载到 Xml 时,出现此错误:
Debug Xml
出于某种原因,它似乎将原始文件路径的一部分与字符串或其他内容一起使用,但即使我尝试手动将其子字符串化,它仍然会出现相同的错误。
我是不是漏掉了什么明显的东西?
非常感谢
我发现一种解决方案是使用 XDocument 而不是 XmlDocument,现在一切正常!
你可以试试这样的
var file = Request.Form.Files[0];
string fs = null;
using (var rr = new StreamReader(file.OpenReadStream()))
{
fs = rr.ReadToEnd();
}
XmlDocument xml = new XmlDocument();
xml.LoadXml(fs);
我有一个网络表单,它只是一个文件输入,用户可以在其中提交 xml 文件,这些文件将发送到我的 API。
我在尝试将这些文件读入 Xml 文档时遇到了问题。我以字符串的形式正确获取了内容,但是当将其加载到我的 xml 文件中时,我收到一条错误消息,指出语法不正确(尽管它看起来与我的原始文件中的一样)。
我尝试了多种不同的方法来从我的 IFormFile 中获取内容,但每种方法似乎都给我同样的问题。
控制器:
public ActionResult ReadFiles()
{
IFormFileCollection selectedFiles = Request.Form.Files;
MemoryStream ms = new MemoryStream();
List<IFormFile> fileList = selectedFiles.ToList();
string[] fileNames = fileList.Select(x => x.FileName).ToArray();
int i = 0;
RestRequest request = new RestRequest(Method.POST);
RestClient client = new RestClient("-EndPoint-");
request.AlwaysMultipartFormData = true;
request.AddHeader("Content-Type", "multipart/form-data");
foreach (IFormFile file in fileList)
{
file.CopyTo(ms);
request.AddFile("components", ms.ToArray(), fileNames[i]);
i++;
}
IRestResponse response = client.Execute(request);
}
在我的 API 中,我尝试了各种方法:
尝试#1
[HttpPost]
public string Checks(IFormFileCollection components)
{
XmlDocument xmlFile = new XmlDocument();
string[] arrFileNames = components.Select(x => x.FileName).ToArray();
int fileNameCounter = 0;
MemoryStream ms = new MemoryStream();
List<IFormFile> fileList = components.ToList();
foreach (IFormFile file in fileList)
{
using (MemoryStream fileStream = new MemoryStream())
{
file.CopyTo(fileStream);
byte[] bytes = fileStream.ToArray();
string xmlString = Encoding.UTF8.GetString(bytes);
xmlFile.Load(xmlString);
//Do Work
}
尝试 #2
StringBuilder xaml = new StringBuilder();
using (var reader = new StreamReader(file.OpenReadStream()))
{
while (reader.Peek() >= 0)
xaml.AppendLine(reader.ReadLine());
}
string xamlString = xaml.ToString();
xmlFile.Load(xamlString);
//Do Work
}
尝试 3
XmlDocument xml = new XmlDocument();
using (MemoryStream ms = new MemoryStream())
{
fileList[0].CopyTo(ms);
xml.Load(Encoding.UTF8.GetString(ms.ToArray()));
}
我尝试的所有其他方法似乎都会导致我遇到同样的问题。当我调试代码时,字符串与我的完整 xml 文件是正确的:
Debug String
但是当我尝试加载到 Xml 时,出现此错误: Debug Xml
出于某种原因,它似乎将原始文件路径的一部分与字符串或其他内容一起使用,但即使我尝试手动将其子字符串化,它仍然会出现相同的错误。
我是不是漏掉了什么明显的东西?
非常感谢
我发现一种解决方案是使用 XDocument 而不是 XmlDocument,现在一切正常!
你可以试试这样的
var file = Request.Form.Files[0];
string fs = null;
using (var rr = new StreamReader(file.OpenReadStream()))
{
fs = rr.ReadToEnd();
}
XmlDocument xml = new XmlDocument();
xml.LoadXml(fs);