3

アクションを使用してデータベースから作成された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です。byte[]ATxtから戻る前にに変換してみたところ、同じ結果になりました。

何か案が?

ありがとう、

カルレス

更新:同じコンテンツからXMLを提供しようとしましたが、切り捨てられます。データでは切り捨てられませんが(EOF文字である可能性があると思いました)、ラベルの途中で切り捨てられます...

4

3 に答える 3

5

私はまったく同じ問題を抱えていました。テキストファイルは常に切り捨てられて返されます。

それは「紅潮」の問題かもしれないと私は思いました、そして実際それはそうでした。ライターのバッファーは、操作の最後にフラッシュされていません-usingブロック、または自動的にフラッシュされる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;
}
于 2009-12-31T01:17:58.690 に答える
3

なぜActionResultを使用しているのですか?

ASP.NET MVC 1には、実行していることだけを表すFileStreamResultがあります。Streamオブジェクトを期待し、それを返します。

public FileStreamResult Test()
{
  return new FileStreamResult(myMemoryStream, "text/plain");
}

あなたがやりたいことのためにうまくいくはずです。変換を行う必要はありません。

あなたの場合、あなたの方法をこれに変えるだけです:

public FileStreamResult ATxt()
{
    var articulos = _articulosService.ObteTotsArticles();
    return new FileStreamResult(CatalegATxt.ATxt(articulos), "text/plain");
}
于 2009-12-24T13:34:12.883 に答える
0

を閉じたいと思うでしょうMemoryStream。まだより多くのデータが必要なため、切り捨てられている可能性があります。または、物事をさらに簡単にするために、次のようなことを試してください。

public static byte[] ATxt(IEnumerable<ArticuloBusquedaDTO> articles)
{
   using(var stream = new MemoryStream())
   {
        var streamWriter = new StreamWriter(stream, Encoding.UTF8);
        foreach (ArticuloBusquedaDTO article in articles)
        {
            streamWriter.WriteLine(article.ToStringFix());
        }

        return stream.ToArray();
    }
}
于 2009-12-24T13:00:50.443 に答える