【问题标题】:asp.net filehelpers write file to client directlyasp.net filehelpers 直接将文件写入客户端
【发布时间】:2013-03-12 12:02:38
【问题描述】:

我将 FileHelpers 库用于 C# .net 项目。一切正常,除了我需要通过单击按钮来保存生成的 CSV。

因此,用户单击一个按钮,他们会收到保存文件的提示。我知道 Filehelpers 有一个 WriteStream 选项,但他们自己的文档只显示了 WriteFile 的一个示例。我不知道是否需要 WriteStream,但我认为是。

有人知道是否可以将 CSV 文件直接保存到客户端而不是服务器硬盘上?

谢谢。

更新更多细节:

我将尝试提供更多细节,以帮助阐明我想要实现的目标。我不想在服务器上保存任何文件。我正在使用 FileHelpers 生成记录,我想尝试使用他们的 WriteStream 方法将该记录作为 CSV 直接写入他们的浏览器;但奇怪的是,他们提供的示例实际上根本没有使用该方法。

这是他们方法的链接:

http://www.filehelpers.com/FileHelpers.FileHelperEngine.WriteStream_overload_2.html

这是有问题的方法。

public void WriteStream(
   TextWriter writer,
   IEnumerable records,
   int maxRecords
);

我可以轻松地将文件保存到服务器,但我不想这样做,因为我不需要它,并且希望让客户端将它直接保存到他们自己的机器上。

可能我必须通过正常途径来实现这一点,但我看到了 WriteStream 方法,并认为 FileHelpers 可能促进了一种很好的干净方式来实现相同的结果。

希望这更清楚。

【问题讨论】:

  • 您能否发布您当前保存文件的工作代码应该不是问题,但是如果不查看您拥有的当前代码,很难确定您正在尝试做什么。如果这是ASP.net 应用程序,那么您希望使用Response Object 以及StreamWriter Class
  • 我真的没有任何代码了(在这个阶段已经编写和删除了一千次)。我要做的是单击按钮以通过浏览器将 CSV 文件返回给用户。我可以将它保存到服务器没有问题,但是在没有保存文件的情况下让 Response.TransmitFile() 的等价物工作让我望而却步。希望这更清楚。
  • 您仍然可以执行此操作,您需要使用Response 执行此操作这里是您可以参考的链接,非常简单stackoverflow.com/questions/10974930/…Response.ContentType = "application/ms-excel"; 更改为Response.ContentType = "application/text";Response.ContentType = "text/csv";
  • 谢谢,我知道以您提到的方式写信给客户,但我认为 FileHelpers 库有一些我可以使用的等价物。也许它没有,我需要使用您链接到的流程,但我可以发誓他们确实提供了相同流程的某些版本。

标签: c# asp.net filehelpers


【解决方案1】:

别忘了刷新 StreamWriter。看例子

public MemoryStream CreateCsvFileAsMemoryStream(List<TestItem> testItems) {
        var engine = new FileHelperEngine<TestItemCsvMapping>();
        var items = testItems.Select(ti => (TestItemCsvMapping)ti).ToList();

        engine.HeaderText = engine.GetFileHeader();
        var ms = new MemoryStream();
        var sw = new StreamWriter(ms);
        engine.WriteStream(sw, items);
        sw.Flush();

        //var reader = new StreamReader(ms);
        //ms.Position = 0;
        //Console.Write(reader.ReadToEnd());

        ms.Position = 0;

        return ms;
    }

【讨论】:

    【解决方案2】:

    您应该能够执行以下操作:

    Response.ContentType = @"application/x-msdownload";
    Response.AppendHeader("content-disposition", "attachment; filename=" + FILE_NAME);
    
    Response.Write(csv.ToString());
    Response.Flush();
    Response.End();
    

    StackOverflow 上有很多更详细的建议,例如 this one。这取决于您要达到的目标。

    编辑

    我认为您缺少的步骤是:

    MemoryStream stream = new MemoryStream();
    StreamWriter streamWriter = new StreamWriter(stream);
    engine.WriteStream(streamWriter, records);
    stream.Position = 0;
    

    然后你就可以使用了

    StreamReader reader = new StreamReader(stream);
    Response.Write(reader.ReadToEnd);
    

    而不是我上面第一个示例中的Response.Write(csv.ToString())

    【讨论】:

    • 谢谢,已经编辑了我的原始问题,以便更清楚地了解我想要实现的目标。
    猜你喜欢
    • 2010-11-07
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 2021-04-22
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多