VB.NET WebClient.UploadFile大文件慢网络上传中止问题求助
适配普通Web上传的流式分块实现方案
我完全懂你遇到的困扰——WebClient.UploadFile会一次性把整个大文件塞进内存再发送,慢网络下很容易因为超时、连接波动导致上传直接中止。我们可以把FTP流式上传的思路平移过来,改用HttpWebRequest手动控制文件的分块读取和发送,既不会占满内存,也能大幅降低中断概率。
下面是完全适配你需求的实现代码,逻辑和你原方法保持一致,但改成了流式分块上传:
Imports System.IO Imports System.Net Imports System.Text Imports Newtonsoft.Json Private Shared Function GetFileUploadResponse(ByVal fileToUpload As String, ByVal accessToken As String, ByVal uploadUrl As String) As UploadResponse ' 分块大小设为1MB(可根据网络情况调整,比如512KB或2MB) Const chunkSize As Integer = 1024 * 1024 Dim fileInfo As New FileInfo(fileToUpload) ' 用HttpWebRequest替代WebClient,实现流式上传的精细控制 Dim request As HttpWebRequest = DirectCast(WebRequest.Create(uploadUrl), HttpWebRequest) request.Method = "POST" request.Headers.Add("Authorization", "OAuth " & accessToken) request.ContentType = "application/octet-stream" ' 若服务器要求表单上传,可改为multipart/form-data(需要额外构建表单格式) request.ContentLength = fileInfo.Length request.Timeout = 300000 ' 设置5分钟超时,可按需调整 request.AllowWriteStreamBuffering = False ' 禁用请求流缓冲,边读边发 Using fileStream As FileStream = File.OpenRead(fileToUpload), requestStream As Stream = request.GetRequestStream() Dim buffer(chunkSize - 1) As Byte Dim bytesRead As Integer ' 分块读取文件并写入请求流 Do bytesRead = fileStream.Read(buffer, 0, chunkSize) If bytesRead > 0 Then requestStream.Write(buffer, 0, bytesRead) requestStream.Flush() ' 立即发送当前块的数据,避免缓存堆积 ' 可选:添加进度日志 ' Console.WriteLine($"已上传 {fileStream.Position}/{fileInfo.Length} 字节") End If Loop While bytesRead > 0 End Using ' 读取并反序列化响应,和原逻辑完全一致 Using response As HttpWebResponse = DirectCast(request.GetResponse(), HttpWebResponse) Using responseStream As Stream = response.GetResponseStream() Using reader As New StreamReader(responseStream, Encoding.UTF8) Dim responseString As String = reader.ReadToEnd() Return JsonConvert.DeserializeObject(Of UploadResponse)(responseString) End Using End Using End Using End Function
关键改动说明:
- 替换为
HttpWebRequest:比起封装过严的WebClient,它能直接控制请求流,禁用缓冲后可以边读文件边发送,彻底避免大文件一次性加载到内存的问题。 - 分块读写逻辑:每次只读取固定大小的文件块,写入请求流后立即刷新,确保数据及时发送到服务器,减少超时和连接中断的风险。
- 自定义配置:你可以根据服务器要求调整
ContentType(比如表单上传需要改成multipart/form-data,需要的话我可以补充这部分代码),也能灵活调整超时时间和分块大小。
额外优化建议:
- 如果服务器支持断点续传(通过
Range请求头实现),可以在上传中断后记录已上传的字节数,下次从断点继续上传,这对极慢网络环境会更友好。 - 可以添加上传进度回调函数,方便实时跟踪上传状态。
内容的提问来源于stack exchange,提问作者Robinex Robin
相关产品推荐
相关产品推荐

