2009-12-24 4 views
3

작업을 사용하여 데이터베이스에서 만든 txt 파일을 제공하려고합니다. 동작은 다음과 같다 :asp.net mvc 서빙 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 문자되었을 줄 알았는데)하지만 레이블의 중간에 자릅니다 ...

+0

Quick Q, txt 및 xml 테스트의 경우 반환되는 파일 크기는 같은 길이입니까? 이것은 우리가 그것을 추적하는 데 도움이 될 수 있습니다. – Rippo

+0

위 ActionResult 메서드에서 CatelegAText.ATxt의 내용을 추적하는 경우 반환하기 전에 정확한 데이터가 들어 있습니까? – glenatron

+0

@Rippo : 길이가 같지 않습니다. txt는 일부 Mb이고, xml은 1Mb보다 작습니다. –

답변

4

나는 똑같은 문제가되었다. 텍스트 파일은 항상 잘 렸습니다.

"플러싱"문제 일 수 있다는 사실이 내 마음에 들었습니다. 작성자의 버퍼는 작업이 끝날 때 플러시되지 않았습니다. 블록을 사용하지 않거나 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; 
} 

희망!

Miroslav

+0

좋아요! 그거였다. 감사. –

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(); 
    } 
} 
+0

나는 이미 동일한 결과로 이것을 시도했다. 또한 반환하기 전에 스트림을 닫으면 오류가 발생합니다 (보기가 닫힌 스트림에 액세스하려고합니다 ...) –

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"); 
} 
+0

'FileStreamResult'가'ActionResult'를 확장한다고 생각합니다. 또한 함수'File'은'FileStreamResult'를 반환합니다 ... –

+0

FileStreamResult는 FileResult를 상속합니다. 특히 클라이언트에게 스트림을 보내도록 설계되었습니다. 필자는 정기적으로이 파일을 사용하여 10-15 메가의 이웃에있는 사용자에게 파일을 보내고 결코 절사하지 않았습니다. – thorkia

+0

FileResult는 ActionResult를 확장하지만 출력을 다르게 처리합니다. 하드 드라이브에 저장된 파일을 보내려면 FileResult를 사용해야합니다. 파일의 내용을 보내려면 FileStreamResult를 사용해야합니다. – thorkia