Http使用请求首部Range标头分段传输时遇到的问题

ly5222518000 2019-01-27 03:48:28
新人分不多请大佬帮帮忙
最近在学习Http原理,了解到请求首部的Range标头可以通知服务器返回的响应正文字节范围
于是有个想法,断点续传的功能是不是就可以这么实现
在本地IIS上放了一个图片,开始测试分段传输这张图片
由于WebClient的DownloadFile方法不能实现断点续传(也有可能是我不会用它实现断点续传)
所以我就使用HttpWebRequest来编写代码
下面是代码
Public Class Form1

Public url As String = "http://localhost/image/1.jpg" '原图
Public save As String = "C:\Users\李阳\Desktop\1.jpg" '下载文件保存的位置
Public file As String = "C:\Users\李阳\Desktop\12.jpg" '这也是原图,我放到桌面上了一个

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
DownloadFirst5000() '下载前5000字节
DownloadNext5000() '下载接下来的5000字节
End Sub

Private Sub BtnStart_Click(sender As Object, e As EventArgs) Handles btnStart.Click
Dim stream1 As FileStream = New FileStream(save, FileMode.Open) '流1是下载的图片
Dim stream2 As FileStream = New FileStream(file, FileMode.Open) '流2是原图
Dim builder As New Text.StringBuilder
For i As Integer = 1 To New FileInfo(save).Length '一个字节一个字节的比较
Dim byte1 As Integer = stream1.ReadByte
Dim byte2 As Integer = stream2.ReadByte
If byte1 <> byte2 Then '找到不同的
builder.AppendFormat(String.Format("第{0,7} 位,流1:{1,4} ,流2:{2,4}", i, byte1, byte2)).AppendLine()
End If
Next
Log(builder.ToString)
End Sub

Sub DownloadFirst5000()
Dim request As HttpWebRequest = WebRequest.Create(url)
request.AddRange("bytes", 0, 4999)
Dim response As HttpWebResponse = request.GetResponse
Dim buffer(response.ContentLength - 1) As Byte
Dim stream As Stream = response.GetResponseStream
stream.Read(buffer, 0, buffer.Count)
With New FileStream(save, FileMode.CreateNew)
.Write(buffer, 0, buffer.Count)
.Close()
End With
Log(response.Headers(HttpResponseHeader.ContentRange))
End Sub

Sub DownloadNext5000()
Dim request As HttpWebRequest = WebRequest.Create(url)
request.AddRange("bytes", 5000, 9999)
Dim response As HttpWebResponse = request.GetResponse
Dim buffer(response.ContentLength - 1) As Byte
Dim stream As Stream = response.GetResponseStream
stream.Read(buffer, 0, buffer.Count)
With New FileStream(save, FileMode.Append)
.Write(buffer, 0, buffer.Count)
.Close()
End With
Log(response.Headers(HttpResponseHeader.ContentRange))
End Sub

Sub 直接下载整个图片()
Dim request As HttpWebRequest = WebRequest.Create(url)
Dim response As HttpWebResponse = request.GetResponse
Dim buffer(response.ContentLength - 1) As Byte
Dim stream As Stream = response.GetResponseStream
stream.Read(buffer, 0, buffer.Count)
With New FileStream(save, FileMode.CreateNew)
.Write(buffer, 0, buffer.Count)
.Close()
End With
Log(response.Headers(HttpResponseHeader.ContentLength))
End Sub

Sub Log(text As String) '写日志
With New StreamWriter("C:\Users\李阳\Desktop\log.txt", True, System.Text.Encoding.Unicode)
.WriteLine(text)
.Close()
End With
End Sub
End Class


DownloadFirst5000()是下载前5000字节
DownloadNext5000()是下载接下来的5000字节
按钮是对比两个文件前10000个字节的不同处,然后写到日志里
下面是日志的截图

日志中可以看到,IIS返回的信息没有任何问题分别是从 0-4999 字节和 5000-9999 字节
前4000多字节没有任何问题,但是从4614字节开始,下载的文件中所有字节都是0,后面截图就不放了,全是0
这个图片是40多万字节,哪怕不用Range标头,直接全都接收了再比较也是同样的结果,依旧是4614位开始全是0
我把url换成本地iis首页,重新测试500字节一组,没有任何问题,下面是截图

研究好久不知道原因,有哪位大佬指教下
...全文
288 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ly5222518000 2019-01-27
  • 打赏
  • 举报
回复
还求路过的大佬指点一下
ly5222518000 2019-01-27
  • 打赏
  • 举报
回复
测试了一圈,好像都不太好使,就那个IIS主页成功了
ly5222518000 2019-01-27
  • 打赏
  • 举报
回复
是图片被压缩了吗,还是别的什么原因

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧