【发布时间】:2017-04-19 15:27:13
【问题描述】:
我的最终目标是上传一个 rtf 文档并将二进制内容存储在一个表中,然后检索该模板的内容,根据一些预定义的标签替换一些文本,并触发浏览器下载更新的模板。我最初的目标是上传一个 rtf 文件(工作),通过我的解析方法运行它(没有更改),并使用原始模板成功打开下载的文件。现在下面的一切都在工作,除了生成的文件已损坏(我不确定我的流是否被正确处理)。我可能应该深入研究 System.IO 以更好地理解内存流等,但这是这个项目中我需要做这样的事情的唯一地方,所以我试图找到一个快速的解决方案。
public static Stream ParseFile(Stream fsTemplate)
{
// create MemoryStream to copy template into and modify as needed
MemoryStream doc = new MemoryStream();
// copy template FileStream into document MemoryStream
fsTemplate.CopyTo(doc);
doc.Position = 0;
string docText = string.Empty;
using (StreamReader reader = new StreamReader(doc))
{
// doctText appears to look how I'd expect when I debug
docText = reader.ReadToEnd();
reader.Close();
}
//replace text in 'docText' as neccessary (not yet implemented)
// This is where I'm not really clear what I should be doing differently
var ms = new MemoryStream();
StreamWriter writer = new StreamWriter(ms);
writer.Write(docText);
ms.Position = 0;
return ms;
}
这是我的控制器,它从数据库中检索二进制数据(上传的rtf模板),调用上述方法,并将文件流返回给浏览器
public FileStreamResult Parse(int id)
{
byte[] data = Context.Templates.Find(id).BinaryData;
Stream stream = new MemoryStream(data);
var updatedStream = Tools.ParseFile(stream);
return File(updatedStream, "application/rtf", "temp.rtf");
}
我用这段代码替换了我的 StreamWriter,现在它按我的预期工作了。不过,我仍然不确定我是否正确处理了我的流。
byte[] buffer = Encoding.ASCII.GetBytes(docText);
MemoryStream ms = new MemoryStream(buffer);
完整代码:
public static Stream ParseFile(Stream fsTemplate)
{
// create MemoryStream to copy template into and modify as needed
MemoryStream doc = new MemoryStream();
// copy template FileStream into document MemoryStream
fsTemplate.CopyTo(doc);
doc.Position = 0;
string docText = string.Empty;
using (StreamReader reader = new StreamReader(doc))
{
// doctText appears to look how I'd expect when I debug
docText = reader.ReadToEnd();
reader.Close();
}
//replace text in 'docText' as neccessary (not yet implemented)
byte[] buffer = Encoding.ASCII.GetBytes(docText);
MemoryStream ms = new MemoryStream(buffer);
return ms;
}
【问题讨论】:
-
您能否在调用 CopyTo 方法之前确认 fsTemplate 位置是否为 0
-
它是否被初始化为 0?这是我创建它并将其传递给 Parse 方法的地方: Stream stream = new MemoryStream(data);
标签: c# asp.net-mvc system.io.file