C# 读取、修改和输出内存中的二进制流
我的最终目标是上传一个rtf文档并将二进制内容存储在一个表中,然后检索该模板的内容,根据一些预定义的标记替换一些文本,并触发浏览器下载更新的模板。我最初的目标是上传一个rtf文件(工作),通过我的解析方法运行它(不做任何更改),并使用原始模板成功打开下载的文件。现在,下面的所有内容都正常工作,除了生成的文件已损坏(我不确定是否正确处理了我的流)。我可能应该深入System.IO以更好地理解内存流等,但这是本项目中唯一需要做类似工作的地方,因此我正在尝试找到一个快速解决方案C# 读取、修改和输出内存中的二进制流,c#,asp.net-mvc,system.io.file,C#,Asp.net Mvc,System.io.file,我的最终目标是上传一个rtf文档并将二进制内容存储在一个表中,然后检索该模板的内容,根据一些预定义的标记替换一些文本,并触发浏览器下载更新的模板。我最初的目标是上传一个rtf文件(工作),通过我的解析方法运行它(不做任何更改),并使用原始模板成功打开下载的文件。现在,下面的所有内容都正常工作,除了生成的文件已损坏(我不确定是否正确处理了我的流)。我可能应该深入System.IO以更好地理解内存流等,但这是本项目中唯一需要做类似工作的地方,因此我正在尝试找到一个快速解决方案 public stat
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;
}
我建议调用writer.Flush()强制它写入缓冲数据,或者使用“using”封装writer实例,最终也会这样做
public static Stream Parse(Stream fsTemplate){...
// 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);
writer.Flush(); // <-- here
ms.Position = 0;
publicstaticstreamparse(streamfstemplate){。。。
//这就是我不太清楚我应该做什么不同的地方
var ms=新内存流();
StreamWriter writer=新StreamWriter(毫秒);
writer.Write(docText);
writer.Flush();//这是如何完成的
创建rtf文档并将其另存为say AAnRTF.txt
内容包括:
<div>
This is an rtf document
<div>
创建用于保存文件的表:
GO
/****** Object: Table [dbo].[ImportModStarterKit] Script Date: 4/19/2017 10:25:48 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[ImportMod](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Contents] [varbinary](max) NULL,
[ContentType] [nvarchar](2048) NULL,
CONSTRAINT [PK_ImportModStarterKit] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
为此表创建edmx ADO.NET实体数据模型
以下是您的看法:
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>UploadFile</title>
</head>
<body>
<div>
@using (Html.BeginForm("UploadFilePost",
"Home",
FormMethod.Post,
new { enctype = "multipart/form-data" }))
{
<div class="commonImportPageHeight">
Import Cases
<div class="boxAroundFileUpload">
<input type="file" name="file" id="file" class="uploadFileWidth" /><br>
<input type="submit" name="SubmitButton" value="Upload RTF" />
<br/>
<input type="submit" name="SubmitButton" value="Download RTF" />
<br>
</div>
</div>
}
</div>
</body>
</html>
@{
布局=空;
}
上传文件
@使用(Html.BeginForm(“UploadFilePost”),
“家”,
FormMethod.Post,
新的{enctype=“multipart/form data”})
{
进口案件
}
在调用CopyTo方法之前,能否确认fsTemplate位置是否为0?它是否初始化为0?这就是我创建它并将其传递到解析方法的地方:Stream Stream=new MemoryStream(data);我感谢您的回复,这可能会对某些人有所帮助,但这并不是我试图解决的问题。我的上载和存储过程已经建立并正常工作,但我在修改文件和返回未损坏的更新版本时遇到问题。我无法将任何内容存储到磁盘,即使是暂时的,因此所有这些都必须在内存中完成。我更新了我的问题,以包含正在运行的代码,并将包含Radislav Kireev的输入。
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>UploadFile</title>
</head>
<body>
<div>
@using (Html.BeginForm("UploadFilePost",
"Home",
FormMethod.Post,
new { enctype = "multipart/form-data" }))
{
<div class="commonImportPageHeight">
Import Cases
<div class="boxAroundFileUpload">
<input type="file" name="file" id="file" class="uploadFileWidth" /><br>
<input type="submit" name="SubmitButton" value="Upload RTF" />
<br/>
<input type="submit" name="SubmitButton" value="Download RTF" />
<br>
</div>
</div>
}
</div>
</body>
</html>