asp.net mvc服务txt文件被截断怎么办?
- 内容介绍
- 文章标签
- 相关推荐
本文共计556个文字,预计阅读时间需要3分钟。
我正在尝试使用操作提供由数据库创建的txt文件。操作如下:
csharppublic ActionResult ATxt(){ var articulos=_articulosService.ObteTotsArticles(); return File(CatalegATxt.ArticlesToTxt(articulos), text/plain);}
CatalegATxt 类是:
我正在尝试使用操作提供由数据库创建的txt文件.行动如下: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; }
希望这可以帮助!
米罗斯拉夫
本文共计556个文字,预计阅读时间需要3分钟。
我正在尝试使用操作提供由数据库创建的txt文件。操作如下:
csharppublic ActionResult ATxt(){ var articulos=_articulosService.ObteTotsArticles(); return File(CatalegATxt.ArticlesToTxt(articulos), text/plain);}
CatalegATxt 类是:
我正在尝试使用操作提供由数据库创建的txt文件.行动如下: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; }
希望这可以帮助!
米罗斯拉夫

