带有可选上传文件的 HttpClient 发布表单

Posted

技术标签:

【中文标题】带有可选上传文件的 HttpClient 发布表单【英文标题】:HttpClient post form with optional upload files 【发布时间】:2013-08-17 15:14:44 【问题描述】:

我有一个网络表单,其中包含多个用于上传照片的选项(最多 10 个)。 ContentType 设置为“multipart/form-data”。我知道如何只上传一个文件,但不知道如何为其他 9 个可选文件创建 HttpContent?使用适当的 ContentDisposition 标头创建 MultipartContent 没有运气。充其量我得到了:

内容配置:表单数据; name="bla bla bla";

或者,如果我将参数添加到 ContentDisposition 标头:

内容配置:表单数据; name="bla bla bla";文件名;

对于像这样的可选上传文件,我需要发送包含空内容的发布请求:

内容配置:表单数据; name="bla bla bla";文件名=""

任何想法表示赞赏。

【问题讨论】:

使用 Wireshark 或 Fiddler 与浏览器一起查看正确的 HTTP 内容的样子,然后在代码中重现它...... 我知道正确的请求是什么样子的。问题是如何在 ContentDispostion 中添加参数“文件名”。空值或空值抛出异常“无效参数”... 我的意思是参数“文件名”为空值。 我不明白你的意思……抱歉。 只有当我实际添加一些有效负载(如 StreamContent)时,参数“文件名”才会出现在 Content-Disposition 标头中。在这种情况下,我有一个正确的 Content-Disposition 标头。我想知道如何创建一些没有实际有效负载但使用 Content-Disposition 标头的 HttpContent,如下所示:form-data;名称=“内容名称”;文件名="" ? 【参考方案1】:

好的,我不知道这是否是我的问题的最佳解决方案,但至少它有效: 1. 为 HttpContent 创建新类(HttpContent 的子类)。 2.初始化Content-Disposition标头。 3. 重写TryComputeLength(return false) 和SerializeToStreamAsync(只是序列化任务的stub) 两个方法。

现在可以将此类添加到MultipartFormDataContent。 http 请求内容如下:

---------[边界字符串]Content-Disposition: form-data; name="formFieldName"; filename=""----------[边界字符串]

【讨论】:

以上是关于带有可选上传文件的 HttpClient 发布表单的主要内容,如果未能解决你的问题,请参考以下文章

HttpClient-- 模拟表单上传文件

通过HttpClient4.5模拟Form表单文件上传

php 带文件上传的表单(可选文件上传)

如何使用 Multer 提交带有可选文件提交的表单?

android的自带的httpClient 怎么上传文件

使用带有表单编码参数和标头的 C# httpclient 发布