C# 读取、修改和输出内存中的二进制流

C# 读取、修改和输出内存中的二进制流,c#,asp.net-mvc,system.io.file,C#,Asp.net Mvc,System.io.file,我的最终目标是上传一个rtf文档并将二进制内容存储在一个表中,然后检索该模板的内容,根据一些预定义的标记替换一些文本,并触发浏览器下载更新的模板。我最初的目标是上传一个rtf文件(工作),通过我的解析方法运行它(不做任何更改),并使用原始模板成功打开下载的文件。现在,下面的所有内容都正常工作,除了生成的文件已损坏(我不确定是否正确处理了我的流)。我可能应该深入System.IO以更好地理解内存流等,但这是本项目中唯一需要做类似工作的地方,因此我正在尝试找到一个快速解决方案 public stat

我的最终目标是上传一个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;
    }

我建议调用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>