You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:31:50