2011-03-11 2 views
2

나는 FOXPRO/FOXWEB 응용 프로그램을 ASP.NET으로 변환하고 있습니다.CSV를 즉시 작성하여 클라이언트로 다운로드

기본 DB는 여전히 foxpro입니다 (잠시 동안).

테이블을 일부 VB.NET 코드로 전달하여 CSV 파일로 변환하고 클라이언트로 다운로드하여 보내도록하고 있습니다. 그리고 그것은 작동합니다! 일종의 ... 때로는 작동하지만 다른 번에 CSV 파일을 다운로드할지 묻는 대신 파일을 브라우저 창에 표시합니다.

asp 쪽에서 응답 개체, 테이블 및 csv 파일 이름을 전달합니다. 파일 clsCommon.vb에서

<% 
    Dim xls_fn As String = "test01.csv" 

    'OLEDB call to fill up 'tbl' ... this works. 

    sendTableAsCSVtoClient(response, tbl, xls_fn) 
%> 

, 나는 다음과 같은 코드가 있습니다

Option Explicit On 
'Option Strict On 

Imports System 
Imports System.Web 
Imports System.Web.UI 
Imports System.Web.UI.Page 
Imports System.IO 
Imports Microsoft.VisualBasic 
Imports System.Diagnostics 
Imports System.Data 
Imports System.Data.OleDb 


Public Class clsCommon 
    Inherits Page 

    Public Shared Function enq(ByVal str As String) As String 
     Dim dq As String 
     dq = """" 
     Return dq & str & dq 
    End Function 

    ' some other functions and subs defined in here ... blah blah blah 
    ' ... 

    Public Shared Function sendTableAsCSVtoClient(ByVal resp As HttpResponse, ByVal sqlTable As DataTable, ByVal xls_fn As String) As Boolean 
     Dim r As DataRow 
     Dim c As DataColumn 
     Dim sep As String = "," 
     Dim FileExtension As String 
     Dim lcFileNameONLY As String 
     Dim i As Integer 
     Dim dq As String = """" 

     FileExtension = UCase(Path.GetExtension(xls_fn)) 
     lcFileNameONLY = UCase(Path.GetFileNameWithoutExtension(xls_fn)) 

     resp.Clear() 
     resp.ClearContent() 
     resp.ClearHeaders() 
     resp.ContentType = "application/vnd.ms-excel" 
     resp.AddHeader("Content-Disposition", "inline; filename=" & lcFileNameONLY & ".csv") 
     For Each c In sqlTable.Columns 
      resp.Write(UCase(c.ColumnName) & sep) 
     Next 
     resp.Write(vbCrLf) 

     For Each r In sqlTable.Rows 
      For i = 0 To sqlTable.Columns.Count - 1 
       resp.Write(enq(r(i)) & sep) 
      Next 
      resp.Write(vbCrLf) 
     Next 

     resp.End() 
     Return True 

    End Function 

End Class 
  1. 이의 원인은 무엇입니까?
  2. 어떻게 해결할 수 있습니까?

나는 데이터 소스가 테이블이라는 사실을 염두에 두지 않는다. 파일은 즉시 만들어지며 서버의 파일 시스템에 존재하지 않습니다.

텍사스, TFF

답변

2

대신 Inline있는 Content-Disposition 헤더를 사용, Attachment을 사용 -이 항상 다운로드하라는 메시지가 표시됩니다.

변경에서 다음 줄

resp.AddHeader("Content-Disposition", "inline; filename=" & lcFileNameONLY & ".csv") 

resp.AddHeader("Content-Disposition", "attachment; filename=" & lcFileNameONLY & ".csv") 

하려면 예제 thisthis를 참조하십시오.

인라인 유형은 브라우저가 인라인으로 (브라우저 내에서) 렌더링 방법을 알고 있음을 의미합니다.

this 질문을 보려면 inline가 가끔 질문을하는 이유를 묻습니다.

+0

크랩. 나는 얼마나 오래 내가 쳐다 보았는지 말할 때 당황 스럽다. 에티켓의 요점 :이 전체 질문을 너무 어리 석은 것으로 삭제해야합니까? – elbillaf

+2

@TheFallibleFiend - 어리석은 질문이나 다른 문제도있을 수 있습니다. 다른 사람들이 찾아서 배울 수 있도록 질문을 열어 두십시오. – Oded

1

문제는 Content-disposition 헤더입니다. "inline" 대신 "attachment"이되어야합니다.

"application/vnd.ms-excel" 대신 "text/csv"이되도록 콘텐츠 형식을 설정할 수도 있습니다. 이렇게하면보다 정확 해집니다. CSV 용으로 다른 것을 사용하기를 원한다면 더 잘 작동 할 것입니다. 그러나 사내 응용 프로그램의 경우 아마도 vnd.ms-excel이 더 잘 작동 할 것입니까?

+0

아, 아주 좋아! 할거야! – elbillaf

1

나는 당신이 내용 - 처리 변경해야 오디드와 chmullig에 동의하지만, 나는 또한 버퍼를 사용하고 플러시 응답을 마무리하는 것이 좋습니다 : (

resp.Clear() 
resp.Buffer = true 

'build csv 

resp.Flush() 
resp.Close() 

내가 .END에게 전화를 믿는다) 예외를 처리하는 방법에 따라 문제를 일으킬 수있는 실행을 중지하려면 ThreadAbortException을 throw합니다.See here for more info

+0

좋은 물건, tx, tff – elbillaf