Car*_*any 3 asp.net-mvc text-files filestreamresult
我正在尝试使用操作提供从数据库制作的 txt 文件。动作如下:
public ActionResult ATxt()
{
var articulos = _articulosService.ObteTotsArticles();
return File(CatalegATxt.ATxt(articulos), "text/plain");
}
Run Code Online (Sandbox Code Playgroud)
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
它只是根据我从数据库中得到的东西写入文件行。但是当我查看文件时,它看起来被截断了。该文件大约为 8Mb。我也尝试byte[]
在从 ATxt 返回之前转换为相同的结果。
任何的想法?
谢谢,
卡尔斯
更新:我还尝试从相同的内容提供 XML,但它也被截断了。它不会在数据上被截断(我认为它可能是其中的一个 EOF 字符)但它在标签的中间被截断......
我遇到了完全相同的问题。文本文件将始终以截断形式返回。
我突然想到这可能是一个“冲洗”问题,确实如此。在操作结束时写入器的缓冲区没有被刷新——因为没有 using 块,或者 Close() 调用——它会自动刷新。
您需要致电:
streamWriter.Flush();
Run Code Online (Sandbox Code Playgroud)
在 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;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1464 次 |
最近记录: |