请各各位大侠,如何取得远程文件的长度(就象网络快车一样,在DOWN这个文件之前先知道这个文件的长度)?

解决方案 »

  1.   

    这要看与远程服务器通讯是什么协议,对Http,我知道,分析协议头就可以了:
    在头部找到“Content-Length”标识,就是文件长度。
      

  2.   

    在传输文件时,都有设定相关属性的Packet
      

  3.   

    是基于HTTP协议的.
    例如,用什么方法可以取得下面这个文件的长度(是下载前,不是DOWN完以后)?
    strURL = "http://article.tianyaclub.com/tenya/tianya050124001.jpg"
      

  4.   

    用HTTP协议的HEAD命令WinSock连接到 article.tianyaclub.com的80端口
    发送 “HEAD /tenya/tianya050124001.jpg”指令
    返回的信息里面就有ContentLength
      

  5.   

    F:\SOFT>nc article.tianyaclub.com 80
    HEAD /tenya/tianya050124001.jpgHTTP/1.1 404 Object Not Found
    Server: Microsoft-IIS/5.0
    Date: Thu, 07 Apr 2005 05:27:53 GMT
    Content-Type: text/html
    Content-Length: 111<html><head><title>Site Not Found</title></head>
    <body>No web site is configured at this address.</body></html>
      

  6.   

    3733 应该是返回的错误的 HTM 的长度.
      

  7.   

    是的,你可以看看 RFC1945
    具体的命令格式我也不记得了………… :)
    ==============================
    4.1  消息类型(Message Types)

    HTTP消息由客户端到服务器的请求和由服务器到客户端的回应组成。HTTP-message   = Simple-Request ; HTTP/0.9 messages
                          | Simple-Response
                          | Full-Request ; HTTP/1.0 messages
                          | Full-Response 完整的请求(Full-Request)和完整的回应(Full-Response)都使用RFC822[7]中实体传
    输部分规定的消息格式。两者的消息都可能包括标题域(headers,可选)、实体主体(entity 
    body)。实体主体与标题间通过空行来分隔(即CRLF前没有内容的行)。Full-Request = Request-Line ; Section 5.1
                            *( General-Header ; Section 4.3
                             | Request-Header ; Section 5.2
                             | Entity-Header ) ; Section 7.1
                            CRLF
                            [ Entity-Body ] ; Section 7.2Full-Response   = Status-Line ; Section 6.1
                            *( General-Header ; Section 4.3
                             | Response-Header ; Section 6.2| Entity-Header ) ; Section 7.1
                            CRLF
                            [ Entity-Body ] ; Section 7.2

    简单请求(Simple_Request)与简单回应(Simple-Response)不允许使用任何标题信息,
    并限制只能使用唯一的请求方法(GET)       Simple-Request  = "GET" SP Request-URI CRLF       Simple-Response = [ Entity-Body ]
    不提倡使用简单方式请求格式,因为它防止了服务器在接到简单请求时对返回实体的介
    质类型进行验证。5. 请求(Request)
    从客户端到服务器端的请求消息包括,消息首行中,对资源的请求方法、资源的标识符
    及使用的协议。考虑到局限性更大的HTTP/0.9的向后兼容问题,有两种合法的HTTP请求
    格式:Request = Simple-Request | Full-RequestSimple-Request = "GET" SP Request-URI CRLFFull-Request = Request-Line ; Section 5.1
    *( General-Header ; Section 4.3
    | Request-Header ; Section 5.2
    | Entity-Header ) ; Section 7.1
    CRLF
    [ Entity-Body ] ; Section 7.2 如果HTTP/1.0服务器收到简单请求,它必须回应一个HTTP/0.9格式的简单回应。
    HTTP/1.0的客户端有能力接收完整回应,但不能产生简单请求。8.2  HEAD

    HEAD方法与GET几乎一样,区别在于,HEAD方法不让服务器在回应中返回任何实
    体。对HEAD请求的回应部分来说,它的HTTP标题中包含的元信息与通过GET请求所得
    到的是相同的。通过使用这种方法,不必传输整个实体主体,就可以得到请求URI所指定
    资源的元信息。该方法通常用来测试超链接的合法性、可访问性及最近更新。
    与条件GET不同,不存在所谓的“条件HEAD”,即"conditional HEAD"。即使在HEAD
    请求中指定If-Modified-Since标题域,它也会被忽略。
      

  8.   

    我来给你写段Winsock取长度的代码,稍等
      

  9.   

    测试成功!写得很粗糙,你可再改良一下!Option Explicit
    Private strURL As String
    Private mstrFileName As String, mlngFileNum As Long
    Private mlngFileLen As Long, mlngCurByte As Long
    Private mblnOnlyLen As Boolean, mblnPutStart As BooleanPrivate Sub Form_Load()
        strURL = "http://article.tianyaclub.com/tenya/tianya050124001.jpg"
        mstrFileName = App.Path & "\1.jpg"
        Label1.Caption = "文件总字节:0"
        Label2.Caption = "已下载字节:0"
        Command1.Caption = "开始下载"
        Command2.Caption = "取得长度"
    End SubPrivate Sub Command1_Click()
        mblnOnlyLen = False
        DownFile
    End SubPrivate Sub Command2_Click()
        mblnOnlyLen = True
        Label1.Caption = "文件总字节:0"
        DownFile
    End SubPrivate Sub DownFile()
        mblnPutStart = False
        Label2.Caption = "已下载字节:0"
        Command1.Enabled = False
        Command2.Enabled = False
        With Winsock1
            If .State <> sckClosed Then .Close
            .Protocol = sckTCPProtocol
            .RemoteHost = "article.tianyaclub.com"
            .RemotePort = 80
            .Connect
        End With
    End SubPrivate Sub Winsock1_Connect()
        Dim s As String
        s = "GET " + strURL + " HTTP/1.0" + vbCrLf
        s = s + "Accept: */*" + vbCrLf
        s = s & "Pragma: no-cache" & vbCrLf
        s = s & "Cache-Control: no-cache" & vbCrLf
        s = s & "Connection: close" & vbCrLf & vbCrLf
        s = s + vbCrLf
        Winsock1.SendData s
    End SubPrivate Sub CloseAll()
        If Winsock1.State <> sckClosed Then Winsock1.Close
        Close #mlngFileNum
        Command1.Enabled = True
        Command2.Enabled = True
    End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
        Dim RevData() As Byte
        Dim a() As Byte, b() As String, c() As String
        Dim s As String, i As Long, k As Long
        On Error GoTo fail
        If mblnPutStart = False Then
            Winsock1.PeekData RevData, vbArray Or vbByte
            k = InStrB(1, RevData, ChrB(13) & ChrB(10) & ChrB(13) & ChrB(10))
            If k > 0 Then
                Winsock1.GetData RevData, vbArray Or vbByte
                a = LeftB(RevData, k - 1)
                RevData = MidB(RevData, k + 4)
                s = StrConv(a, vbUnicode)
                b = Split(s, vbCrLf)
                If InStr(1, b(0), "200 OK", vbTextCompare) = 0 Then GoTo fail
                For i = 1 To UBound(b)
                    c = Split(b(i), ": ")
                    Select Case c(0)
                        Case "Content-Length"
                            mlngFileLen = CLng(c(1))
                            Label1.Caption = "文件总字节:" & mlngFileLen
                            If mblnOnlyLen Then
                                CloseAll
                                Exit Sub
                            End If
                    End Select
                Next
                mblnPutStart = True
                mlngCurByte = UBound(RevData) + 1
                mlngFileNum = FreeFile
                Open mstrFileName For Binary As #mlngFileNum
            Else
                Exit Sub
            End If
        Else
            Winsock1.GetData RevData, vbArray Or vbByte
            mlngCurByte = mlngCurByte + bytesTotal
        End If
        Put #mlngFileNum, , RevData
        Label2.Caption = "已下载字节:" & mlngCurByte
        If mlngCurByte = mlngFileLen Then
            CloseAll
            MsgBox "下载成功!"
        End If
        Exit Sub
    fail:
        CloseAll
        MsgBox "网络传输错误,文件下载失败!"
    End Sub
      

  10.   

    注意:URL中若含中文或一些特殊字符,你还需做个"%"转换
      

  11.   

    我顶!!!
    这个列子能不能改成FTp下载哦
      

  12.   

    这类例子可以去枕善居下载原代码.
    http;//www.mndsoft.com/blog