当前位置: 首页 > 知识库问答 >
问题:

使用HttpClient上载多部分表单文件

冀胤运
2023-03-14

我正在尝试使用Support Bee API创建附件,如下所述:https://supportbee.com/api#create_attachment

我编写了一个服务,它使用HttpClient创建并发送使用文件名的请求。

如果我在《邮递员》中测试,它会成功。我正在为正文使用表单数据,只是从UI中选择要上载的文件:

360ef-c535-405c-9600-1cb02dcff28b.png" width="100%" height="100%" />

当我试图通过我的HttpClient服务上传它时,它不起作用:

public async Task<string> CreateAttachmentAsync(string fileName)
{
    // "client" is HttpClient provided via D.I.

    MultipartFormDataContent content = new MultipartFormDataContent();
    content.Add(new StreamContent(new FileStream(fileName, FileMode.Open)), "files[]");

    using (HttpResponseMessage response = await client.PostAsync(
        "https://xxx.supportbee.com/attachments?auth_token=xxx",
        content))
    {
        string responseString = await response.Content.ReadAsStringAsync();

        return responseString;
    }
}

这将导致500内部服务器错误。检查MultipartFormDataContent对象时,我可以看到它的标题值正在自动设置:

{内容类型:多部分/表单数据;边界=“c9be3778-4de5-4460-9929-ADCAA6BDA79”内容长度:164}

我也尝试先将文件读取到字节数组,并使用ByteArrayContent而不是StreamContent,但没有成功。响应没有提供任何有用的东西,但是由于请求在邮递员中工作,我的代码一定有问题,但是我不知道还可以尝试什么。

编辑:我用Fiddler测试了成功的邮递员请求和我的代码。以下是邮递员的请求:

POSThttps://xxx.supportbee.com/attachments?auth_token=xxxHTTP/1.1用户代理:PostmanRuntime/7.22.0接受:/Cache-Control:no-ache邮递员令牌:f84d22fa-b4b1-4bf5-b183-916a786c6385主机:xx.supportbee.com内容类型:多部分/表单数据;边界=--------------------------714700821471353664787346接受编码:gzip,压缩, br内容-长度:241连接:关闭

----------------------------714700821471353664787346内容处理:表单数据;name=“files[]”;filename=“sample.txt”内容类型:文本/普通

这包含示例文本----------------------------714700821471353664787346--

我代码中失败的请求:

邮递https://xxx.supportbee.com/attachments?auth_token=xxxHTTP/1.1主机:xxx。supportbee。com接受:/Accept编码:gzip,deflate,br连接:关闭内容类型:多部分/表单数据;boundary=“ea97cbc1-70ea-4cc4-9801-09f5feffc763”内容长度:206

--ea97cbc1-70ea-4cc4-9801-09f5feffc763内容处理:表单数据;name=“files[]”;文件名=样本;文件名*=utf-8“示例

这包含示例文本--ea97cbc1-70ea-4cc4-9801-09f5feffc763--

我可以看到的区别是,Postman中的单个部分有自己的内容类型:text/plain文件头,而我的没有。我无法添加此部分,因为如果我尝试内容。标题。添加(“内容类型”、“文本/普通”) 失败,原因是“无法添加值,因为标题“内容类型”不支持多个值。”


共有1个答案

祁修平
2023-03-14

首先,需要注意的是,一个500响应类似于一个未处理的异常,也就是说,这是一个错误,或多或少不可能确定你做错了什么。我建议向他们报告,虽然我不熟悉Support Bee,但我希望他们有好的支持人员可以帮助您解决问题。:)

但是如果你想玩猜谜游戏,我同意你成功的邮递员呼叫和你的代码之间的细微差异是一个很好的开始。对于该标头,请注意ContentMultipartFormDataContent。您实际上想要在StreamContent对象上设置它。

另外,查看Postman正在发送的请求标头,并查看Content-Displace是否包含filename。如果API希望如此,您可能也需要将其添加到代码中。

以下是如何做到这两个方面:

var fileContent = new StreamContent(File.OpenRead(path));
fileContent.Headers.ContentType = new MediaTypeHeaderValue("text/plain");
content.Add(fileContent, "files[]", Path.GetFileName(path));

如果这不是问题所在,请查看Postman中请求正文的“原始”版本,以及这11个请求头,看看是否可以发现可能缺少的任何内容。

 类似资料:
  • 有人知道如何在中使用吗。Net 4.5与上传? 我在网上找不到任何例子。

  • 问题内容: 我对HttpClient非常满意,并且发现缺少(或公然不正确的)文档非常令人沮丧。我正在尝试使用Apache Http Client实现以下文章(在下面列出),但不知道如何实际执行。下周我将把自己埋在文档中,但是也许更有经验的HttpClient编码人员可以早日给我答案。 发布: 问题答案: 使用HttpMime库中的 MultipartEntityBuilder 来执行所需的请求。

  • 我有一个windows服务,正在上传一个多部分数据表单在C#。它上传了一个csv,其中包含身份验证变量,形式如下:一个密钥、一个上下文和一个UUID。变量是在自定义标记类中设置的。每次我尝试上传,我得到一个403错误。 在我的开发过程中,我创建了自己的S3 bucket,并添加了能够成功上传文件的NuGet AWS S3类。现在我上传到第三方桶,我不断得到一个403错误。谢了!

  • 我正在尝试在 Java 应用程序中设置一个 Apache Camel 路由,其中使用者终结点是一个 restlet 组件,它将 HTTP 文件上传作为多部分表单数据的 POST 进行处理,然后创建者终结点将请求转发到也接受多部分表单数据的 rest 服务。我是骆驼的新手,不知道如何正确地连接它。以下是到目前为止我的路线。我是否需要对正文进行任何转换,还是会按原样转发多部分表单数据?有人可以为我提供

  • 我想在API正文中以多部分形式发送以下POST请求: 上传传递两个属性(KEY)和(VALUE)发送arquivo(KEY)和(file)如何使用REST-Assured实现这一点 多部分打印https://ibb.co/0QQCkQv 尝试:

  • 我正在尝试编写一个SpringMVC方法,它可以接收多部分/表单或传输编码的分块文件上传。我可以编写一个单独的方法来处理每种类型,但我希望使用相同的方法,以便使用相同的REST POST uri,例如: 以下是我迄今为止最好的尝试: 使用上述方法,我可以上传一个多部分文件,但如果我上传一个分块文件,我会从spring得到一个异常,它说: 如果我删除MultipartFile请求参数,它非常适合分块