|
If bMultipart Then ' 如果是多部分范围请求, ' 我们还必须计算出将发送的最后一个中间头信息的长度 iResponseContentLength +=MULTIPART_BOUNDARY.Length ' 8 是破折号和换行符的长度 iResponseContentLength += 8 Else ' 不是多部分下载,因此我们必须说明初始HTTP头信息的响应范围 objResponse.AppendHeader( HTTP_HEADER_CONTENT_RANGE, "bytes " & _ alRequestedRangesBegin(0).ToString & "-" & _ alRequestedRangesend(0).ToString & "/" & _ objFile.Length.ToString) 'End If ' 范围响应 objResponse.StatusCode = 206 ' 局部响应 Else ' 这不是范围请求,或者被请求的范围实体ID与当前的实体ID不匹配, ' 因此开始新的下载 ' 指明文件完成部分的大小等于内容的长度 iResponseContentLength =Convert.ToInt32(objFile.Length) ' 返回正常的OK状态 objResponse.StatusCode = 200 End If ' 接下来服务器必须发送几个重要的响应头信息,例如内容长度、Etag、和文件的内容类型: ' 把内容长度写入响应 objResponse.AppendHeader( HTTP_HEADER_CONTENT_LENGTH,iResponseContentLength.ToString) ' 把最后修改日期写入响应 objResponse.AppendHeader( HTTP_HEADER_LAST_MODIFIED,objFile.LastWriteTimeUTC.ToString("r")) ' 告诉客户端软件我们接受了范围请求 objResponse.AppendHeader( HTTP_HEADER_ACCEPT_RANGES,HTTP_HEADER_ACCEPT_RANGES_BYTES) ' 把文件的实体标签写入响应(用引号括起来) objResponse.AppendHeader(HTTP_HEADER_ENTITY_TAG, """" & objFile.EntityTag & """") ' 把内容类型写入响应 If bMultipart Then ' 多部分消息有这种特殊的类型 ' 在例子中文件实际的mime类型在以后才写入响应 objResponse.ContentType = MULTIPART_CONTENTTYPE Else ' 单个部分消息拥有的文件内容类型 objResponse.ContentType = objFile.ContentType End If
下载所需要的一切都准备好了,可以开始下载文件了。你将使用FileStream对象从文件中读取字节块。把FileInformation实例objFile的State属性设置为fsDownloadInProgress。只要客户端保持连接,服务器就从文件中读取字节块并发送给客户端。对于多部分下载,这段代码会发送特定的头信息。如果客户端中断连接,服务器就把文件状态设置为fsDownloadBroken。如果服务器完成了被请求范围的发送过程,它会把状态设置为fsDownloadFinished(见下载代码)。
上一页 [1] [2] [3] [4] [5] [6] 下一页
|