VB.NET HttpClient发送MultipartFormData与Python格式对齐问题
解决VB.NET HttpClient发送multipart/form-data文件上传格式问题
使用VB.NET的HttpClient发送multipart/form-data请求时,生成的请求格式不符合服务器要求。当前代码将file字段的文件名、Content-Type和文件内容混在一个字符串中传递,而Python发送的有效请求里,file字段是独立的文件项,包含正确的Content-Disposition头和文件内容。需要调整VB代码的payload结构,让请求格式与Python版本一致。
原错误VB代码
Dim Myurl As String = "http://" & "192.168.33.136/job" Dim client = New HttpClient() Dim FormData = New MultipartFormDataContent() Dim payloadData = New Dictionary(Of String, String)() payloadData.Add("key", FabMoKey) payloadData.Add("index", "0") payloadData.Add("file", "filename=" & Chr(34) & "Fred.sbp" & Chr(34) & " Content-Type:Text/plain mx,10 mx,0 ") For Each payloadItem In payloadData FormData.Add(New StringContent(payloadItem.Value), payloadItem.Key) Next Dim request = New HttpRequestMessage(HttpMethod.Post, Myurl) request.Headers.Add("accept", "application/json") request.Content = FormData Dim response = Await client.SendAsync(request)
服务器接收的请求对比
有效请求(Python发送)
Boundary: \r\n------WebKitFormBoundarya0nvAqIq8dCKaGRy\r\n Encapsulated multipart part: (text/plain) Content-Disposition: form-data; name="file"; filename="blob"\r\n Content-Type: text/plain\r\n\r\n Line-based text data: text/plain (2 lines) MX, 10\n MX, 0 Last boundary: \r\n------WebKitFormBoundarya0nvAqIq8dCKaGRy--\r\n
无效请求(VB代码发送)
Boundary: \r\n--0e39c991-6b94-41f2-9cd0-933a79a3886b\r\n Encapsulated multipart part: (text/plain) Content-Disposition: form-data; name=file\r\n\r\n Content-Type: text/plain; charset=utf-8\r\n Line-based text data: text/plain (1 lines) filename="Fred.txt"\r\n Content-Type: Text/plain \r\n\r\n mx,10 \n mx,0 \r\n Last boundary: \r\n--0e39c991-6b94-41f2-9cd0-933a79a3886b--\r\n
修正后的VB代码
Dim Myurl As String = "http://192.168.33.136/job" Dim client = New HttpClient() Dim FormData = New MultipartFormDataContent() ' 添加普通文本字段 FormData.Add(New StringContent(FabMoKey), "key") FormData.Add(New StringContent("0"), "index") ' 构造文件内容并设置正确的请求头 Dim fileContent = New StringContent("mx,10" & vbCrLf & "mx,0") ' 设置文件的Content-Type fileContent.Headers.ContentType = New System.Net.Http.Headers.MediaTypeHeaderValue("text/plain") ' 将文件内容添加到表单,同时指定字段名和文件名 FormData.Add(fileContent, "file", "Fred.sbp") Dim request = New HttpRequestMessage(HttpMethod.Post, Myurl) request.Headers.Add("accept", "application/json") request.Content = FormData Dim response = Await client.SendAsync(request)
修正说明
- 普通字段直接使用
StringContent添加即可,无需额外处理 - 文件字段需单独构造内容,明确设置
Content-Type为text/plain - 使用
MultipartFormDataContent.Add(content, name, fileName)重载,HttpClient会自动生成包含name="file"; filename="Fred.sbp"的Content-Disposition头,与Python请求格式一致 - 避免将文件名、Content-Type和文件内容混为一个字符串作为普通字段值传递
内容的提问来源于stack exchange,提问作者user3786542
相关产品推荐
相关产品推荐

