我正在尝试使用操作提供由数据库创建的txt文件.行动如下: public ActionResult ATxt(){ var articulos = _articulosService.ObteTotsArticles(); return File(CatalegATxt.ATxt(articulos), "text/plain");} 和CatalegATxt类是:
public ActionResult ATxt() { var articulos = _articulosService.ObteTotsArticles(); return File(CatalegATxt.ATxt(articulos), "text/plain"); }
和CatalegATxt类是:
using System; using System.Collections.Generic; using System.IO; using System.Text; using WebDibaelsaMVC.DTOs.Busqueda; namespace WebDibaelsaMVC.TxtLib { public static class CatalegATxt { public static Stream ATxt(IEnumerable<ArticuloBusquedaDTO> articles) { var stream = new MemoryStream(); var streamWriter = new StreamWriter(stream, Encoding.UTF8); foreach (ArticuloBusquedaDTO article in articles) { streamWriter.WriteLine(article.ToStringFix()); } stream.Seek(0, SeekOrigin.Begin); return stream; } public static string ToStringFix(this ArticuloBusquedaDTO article) { string result = ""; result += article.CodigoArticulo.PadRight(10, ' ').Substring(0, 10); result += article.EAN.Trim().PadLeft(13, '0').Substring(0, 13); result += article.NombreArticulo.PadRight(100, ' ').Substring(0, 100); result += article.Marca.PadRight(100, ' ').Substring(0, 100); result += article.Familia.PadRight(50, ' ').Substring(0, 50); result += article.PrecioCesion.ToStringFix(); result += article.PVP.ToStringFix(); return result; } private static string ToStringFix(this double numero) { var num = (int)Math.Round(numero * 100, 0); string result = num.ToString().PadLeft(10, '0'); return result; } } }
它只根据我从数据库中获取的东西写入文件行.但是当我查看文件时,它看起来被截断了.该文件大约是8Mb.我也尝试在从ATxt返回之前转换为byte [],结果相同.
任何的想法?
谢谢,
普约尔
更新:我还试图从相同的内容提供XML,它也被截断.它不会被截断数据(我认为它可能是一个EOF字符),但它在标签的中间被截断…
我遇到了完全相同的问题.文本文件将始终作为截断返回.我突然想到它可能是一个“潮红”的问题,事实确实如此.编写器的缓冲区在操作结束时没有被刷新 – 因为没有使用块或者Close()调用 – 它会自动刷新.
你需要打电话:
streamWriter.Flush();
在MVC接管流之前.
这是你的方法应该是这样的:
public static Stream ATxt(IEnumerable<ArticuloBusquedaDTO> articles) { var stream = new MemoryStream(); var streamWriter = new StreamWriter(stream, Encoding.UTF8); foreach (ArticuloBusquedaDTO article in articles) { streamWriter.WriteLine(article.ToStringFix()); } // Flush the stream writer buffer streamWriter.Flush(); stream.Seek(0, SeekOrigin.Begin); return stream; }
希望这可以帮助!
米罗斯拉夫