【问题标题】:How to retrieve and download server files (File.Exists and URL)如何检索和下载服务器文件(File.Exists 和 URL)
【发布时间】:2009-09-06 01:18:29
【问题描述】:

我有一个数据库表,用户在其中标记要下载的文件。随后,我浏览此表并需要创建一个 fileList 以传递给 ActiveX 下载器。我的例程在本地和服务器上仅针对第一个文件工作。我知道我的逻辑一定很糟糕,但我找不到。所有这些文件始终位于同一服务器目录中,如下所示:“D:\inetpub\vhosts\WebSite.com\sessionVideos\”

Sub (GetFileList)
Dim dtVideosSelected As New DataTable
Dim drVideosSelected As New DataRow
Dim strSourceDirectory As String = "sessionVideos/"
Dim strServerBasePath As String = Server.MapPath(strSourceFileDirectory)
Dim strFileName As String
Dim fileInfo As System.IO.FileInfo
Dim i As Int16

Response.Clear()
Response.ContentType = "text/plain"
Response.Charset = "UTF-8"

i = 0
Do While i < dt VideosSelected.Rows.Count
    drVideosSelected = dtVideosSelected.Rows(i)
    strFileName = drVideosSelected("VID_FileName")
    If File.Exists(strServerbasePath & strFileName)
        fileInfo = New System.IO.FileInfo(strServerbasePath & strFileName)
        Response.Write("*/* | " & fileInfo.Length & " | " & fileInfo.Name & " | ")
        Response.Write(EncodeFileName(strSourceFileDirectory & fileInfo.Name) & vbCr
            & vbLf)
    End If
    i += 1
Loop

Response.End()
Response.Flush()
End Sub

Private Function EncodeFileName(ByVal fullPath As String) As String
    Return Server.UrlEncode(fullPath).Replace("+", "%20").Replace("%2f", "/")
End Function

我尝试了很多不同的方法,但都没有成功。

詹姆斯

【问题讨论】:

  • 当您说它不起作用时,您的意思是 activex 控件没有下载文件还是您实际上检查了返回到浏览器的响应(使用诸如提琴手或网络标签之类的东西firebug)并查看输出(如果有,请包含它)。另外,当您通过在 i = 0 语句上设置断点并从那里逐步运行来使用调试器逐步执行代码时会发生什么?您应该能够看到它的作用。如果行数仅为 1 或文件存在则返回 false 等...
  • 阅读您对 adatapost 他/她的建议的评论我现在明白它在本地工作正常,但在服务器上却不行。这表明问题不在您的代码逻辑中。而是在本地和服务器配置之间有所不同。请检查本地和服务器上的 http 响应。包括标题并比较这两者。
  • 对不起,我不够清楚。我的测试情况是我有三个标记为下载的文件(确认查询返回这个)。我的循环在这里只返回一个文件而不是它应该返回的三个文件。谢谢 - 詹姆斯
  • 循环似乎很好。这个问题是在两个位置都出现还是只在远程位置出现?
  • 就在服务器上。这将在本地返回所有三个文件。我可以知道,因为返回的文件列表在下载器中可见。我在本地获取所有三个文件,并且只在服务器上获取第一个文件。文件和目录是相同的,当然服务器路径不同。奇怪的是为什么第一个文件有效,而其他文件无效。

标签: asp.net vb.net file io


【解决方案1】:

要下载文件,

Dim b() As Byte = System.IO.File.ReadAllBytes(strServerbasePath & strFileName)
Response.Clear()
Response.ClearHeader()
Response.AddHeader("Content-Type: application/octate-stream")
Repponse.AddHeader("Content-Length: " & b.Length)
Response.AddHeader("Content-Disposition: attachment; filename=" & strFileName)
Response.BinaryWrite(b)
Response.Flush()
Response.End()

【讨论】:

  • 谢谢,但我不需要知道如何下载文件。我正在使用购买的 ActiveX 控件来完成这项工作。我正在下载多个文件,需要在此处创建文件列表以传递给下载器。问题是它只拾取第一个文件。我确信我的书面逻辑存在问题。同样,这在本地工作得很好,但在服务器上却不行。谢谢,詹姆斯
【解决方案2】:

好的,我们有答案了....实际上,我对不起作用的文件有双重文件扩展名,但隐藏已知扩展名的选项已打开(我猜是默认情况下)。 .avi 文件看起来与其他文件相同,所以我猜它正在考虑将 .avi 视为“未知”文件类型。随便!

答案在我的另一篇文章中:

Why is FileInfo showing an extra file extension?

谢谢, 詹姆斯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 2020-01-27
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多