C# 二进制文件POST请求

4

我正在处理一个第三方API,该API要求二进制文件上传请求格式不包含 Content-Type 头部值为 multipart/form-data,并包含以下头部信息:

Content-Type: application/octet-stream
Content-Disposition: filename*=UTF-8''file.zip

HttpRequestMessageHttpContent.Headers.ContentDisposition.DispositionType都无法帮助我达成目标,因为我不能按照预期设置值,或者它们会自动设置。

我知道这个API可能没有遵循HTTP标准,但这不是我的API,我对此没有影响力。

我的尝试却失败了

    using (HttpClient client = new HttpClient())
    {
        client.DefaultRequestHeaders.ExpectContinue = false;
        FileStream fs = new FileStream(@"e:\dev\TestHalfB.docx", FileMode.Open);

        HttpRequestMessage req = new HttpRequestMessage(HttpMethod.Post, <Uri>);
        HttpContent fc = new StreamContent(fs);
        var mpContent = new MultipartFormDataContent();
        mpContent.Add(fc);
        fc.Headers.ContentType = MediaTypeHeaderValue.Parse("application/octet-stream");
        req.Content = fc;
        fc.Headers.ContentDisposition.DispositionType = "filename*=UTF-8''TestHalfB.docx";

        using (var response = await client.SendAsync(req))
        {
            response.EnsureSuccessStatusCode();
            var resp = await response.Content.ReadAsStringAsync();
        }

        fs.Close();
    }

有人知道我可以使用哪个较低级别的API或有什么建议吗?

所以关键是如何将Content-Disposition头设置为我想要的值。


еҪ“жӮЁеҸ‘еҮәиҜ·жұӮж—¶пјҢFiddlerеңЁжӮЁзҡ„Content-DispositionеӨҙйғЁжҳҫзӨәдәҶд»Җд№Ҳпјҹ - undefined
1
你可能会用ByteArrayContent更好,但是你实际上收到了什么错误? - undefined
你是否遇到编译错误或运行时错误?是哪一行出错了? - undefined
1
API拒绝接受请求,因为根据我的问题需要头信息值。文件载荷本身是正常的。编译器不允许我设置 fc.Headers.ContentDisposition.DispositionType = "filename*=UTF-8''TestHalfB.docx"。会给出无效值错误提示。 - undefined
3个回答

3

我不得不改用WebRequest

    WebRequest request = WebRequest.Create("https://cloud.memsource.com/web/api2/v1/projects/{id}/jobs?token={token}");
    request.Method = "POST";
    byte[] byteArray = File.ReadAllBytes(@"E:\Dev\TestHalfB.docx");
    request.ContentType = "application/octet-stream";
    request.ContentLength = byteArray.Length;
    request.Headers.Add("Content-Disposition", "filename*=UTF-8''TestHalfB.docx");
    Stream dataStream = request.GetRequestStream();
    dataStream.Write(byteArray, 0, byteArray.Length);
    dataStream.Close();
    WebResponse response = request.GetResponse();
    ((HttpWebResponse)response).StatusDescription.Dump();

经过数小时的尝试,这个答案也适用于以二进制格式将图像上传到Azure DevOps作为附件,但需要Content-Type: application/octet-stream - undefined

0

你能试试这个吗。

   HttpContent fileStreamContent = new StreamContent(paramFileStream);

    using (var formData = new MultipartFormDataContent())
    {
        formData.Add(fileStreamContent, "file1", "file1");
        var response = client.PostAsync(actionUrl, formData).Result;
    }

1
谢谢,但我问题的重点是如何设置头部信息。你的回答没有尝试设置其中任何一个。 - undefined

-1

这个应该对你有用(或者至少能让你开始,因为它还没有经过测试):

HttpRequestMessage req = new HttpRequestMessage(HttpMethod.Post, <Uri>);
using (FileStream fs = new FileStream(@"e:\dev\TestHalfB.docx", FileMode.Open))
{
    byte[] fb = new byte[(int)fs.Length]; // assumes your file size will fit into an int
    await fs.ReadAsync(fb, 0, (int)fs.Length);
    req.Content = new ByteArrayContent(fb);
    req.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/octet-stream");
    req.Content.Headers.ContentDisposition.FileNameStar = "UTF-8''TestHalfB.docx";

    using (var response = await client.SendAsync(req))
    {
        response.EnsureSuccessStatusCode();
        var resp = await response.Content.ReadAsStringAsync();
    }
}

谢谢@howcheng,但我已经尝试过了,将req.Content.Headers.ContentDisposition.DispositionType设置为filename*=UTF-8''TestHalfB.docx是不可能的,编译器会报错,提示无效的值。 - undefined
@phil 你的意思是你在运行时遇到了异常吗?因为我看不出编译器会关心这个。无论如何,结果发现有一个FileNameStar属性。尝试设置它(回答已经更新)。再次提醒,这还未经过测试。 - undefined
是的,抱歉,我遇到了一个运行时异常。如果没有将ContentDisposition.FileNameStar添加到MultipartFormDataContent中,我无法设置它,并且这总是会引入一个带有multipart/form-dataContent-Type头,而该API则拒绝这样做。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接