.net 使用参数将多部分表单数据上载到HTTP服务器

huus2vyu  于 2022-12-30  发布在  .NET
关注(0)|答案(1)|浏览(116)

我有一个HTTP服务器,它支持文件的多部分表单上传。

curl  -v --location --request POST 'http://192.168.1.3:9876/storage/module' \
--form 'name="I0000000001"' \
--form 'type="Log"' \
--form 'version="1.0.0.1"' \
--form 'user="admin"' \
--form 'file=@"/tmp/logDump.tgz"'

但我无法成功地将其转换为C#。服务器抛出HTTP 500,因为在使用C#发送时缺少参数(nameversiontypeuser)。我可以在Curl、Python和C++中使相同的文件上传工作,因此这不是服务器的问题,而是我的C#代码的问题。

string filePath = @"/tmp/logDump.tgz";
using (var httpClient = new HttpClient())
{
    using (var form = new MultipartFormDataContent())
    {
        using (var fs = File.OpenRead(filePath))
        {
            using (var streamContent = new StreamContent(fs))
            {
                using (var fileContent = new ByteArrayContent(await streamContent.ReadAsByteArrayAsync()))
                {
                    fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data");

                    form.Add(fileContent, "file", Path.GetFileName(filePath));
                    form.Add(new System.Net.Http.MultipartContent("SIM00000001"), "name");
                    form.Add(new System.Net.Http.MultipartContent("Log"), "type");
                    form.Add(new System.Net.Http.MultipartContent("1.0.0.135"), "version");
                    form.Add(new System.Net.Http.MultipartContent("admin"), "user");
                    HttpResponseMessage response = await httpClient.PostAsync("http://192.168.1.3:9876/storage/module", form);
                    response.EnsureSuccessStatusCode();
                    Console.WriteLine($" result is {response.StatusCode}");
                }
            }
        }
    }
}

如何正确地做到这一点?

abithluo

abithluo1#

多部分表单数据应仅作为键-值对发送,请替换以下行,

form.Add(new System.Net.Http.MultipartContent("SIM00000001"), "name");
 ...

到,

form.Add(new StringContent("SIM00000001"), "name");
 ...

相关问题