2011-03-11 42 views
2

我正在将一堆FOXPRO/FOXWEB应用程序转换为ASP.NET。将即时创建的CSV发送回客户端进行下载

底层数据库仍然是foxpro(目前)。

我正在将一个表传递给一些我想要转换为CSV文件并发送回客户端进行下载的VB.NET代码。它的工作原理!排序...有时可以工作,但在其他时间,而不是问我是否要下载CSV文件,它只是将文件发送到浏览器窗口。

在asp端,我传递响应对象,表和csv文件名。

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

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

    sendTableAsCSVtoClient(response, tbl, xls_fn) 
%> 

在文件clsCommon.vb,我有以下代码:

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. 我该如何解决它?

我猜数据源是一个表并不重要。 请注意,该文件是即时创建的,并且从不存在于服务器的文件系统中。

TX, TFF

回答

2

而不是使用Content-Disposition头是Inline的,使用Attachment - 这将始终提示下载。

更改从以下行:

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

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

见例子thisthis

内联类型意味着浏览器可以自由地将它内联呈现(在浏览器内),如果知道如何的话。

并参见this这个问题,问为什么inline有时会提示下载(与您的问题完全相反......)。

+0

废话很快。我很尴尬地说,我盯着这个东西多久了。礼节点:我是否应该删掉整个问题太愚蠢? – elbillaf 2011-03-11 19:44:54

+2

@TheFallibleFiend - 没有问题是愚蠢的,其他人也可能有这个问题。将问题留给其他人寻找并学习。 – Oded 2011-03-11 19:46:32

1

问题是您的Content-disposition标题。它应该是"attachment"而不是"inline"

您可能还希望将内容类型设置为"text/csv"而不是"application/vnd.ms-excel"。这样你就更准确了,如果他们更喜欢使用其他的CSV,它应该会更好。然而,对于内部的应用程序,也许vnd.ms-excel可能会更好?

+0

啊,非常好!会做! – elbillaf 2011-03-11 19:46:45

1

我同意俄德和chmullig,你应该改变内容处置,但我也建议使用缓冲区和完成了冲洗的响应:

resp.Clear() 
resp.Buffer = true 

'build csv 

resp.Flush() 
resp.Close() 

我相信.END通话( )抛出一个ThreadAbortException来停止执行,这可能会导致问题,这取决于你如何处理异常。See here for more info

+0

好东西,tx,tff – elbillaf 2011-03-11 19:57:43

相关问题