You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用HttpWebRequest同时发送JSON请求体与文件至API?

如何在C#中通过multipart/form-data同时发送JSON请求体和文件?

你的问题核心是要正确构建multipart/form-data格式的请求——这种格式需要用指定的边界分隔不同的内容块(JSON和文件),而不是直接把JSON写入流就完事。我帮你修改代码,实现同时发送JSON请求体和指定路径的文件:

修改后的完整代码

using System;
using System.IO;
using System.Text;

class Program
{
    static void Main()
    {
        const string WEBSERVICE_URL = "https://myurl.com";
        const string boundary = "12345678912345678912345678";
        var webRequest = System.Net.WebRequest.Create(WEBSERVICE_URL);
        webRequest.Method = "POST";
        webRequest.ContentType = $"multipart/form-data; boundary={boundary}";
        webRequest.Headers.Add("Authorization:7786FFFGFDDDP");

        // 1. 准备JSON内容
        string json = "{\"some json\":\"here\"}";
        byte[] jsonBytes = Encoding.UTF8.GetBytes(json);

        // 2. 准备文件内容
        string filePath = @"c:\myFile.txt";
        byte[] fileBytes = File.ReadAllBytes(filePath);
        string fileName = Path.GetFileName(filePath);

        using (var requestStream = webRequest.GetRequestStream())
        using (var writer = new BinaryWriter(requestStream))
        {
            // 写入JSON部分
            writer.Write(Encoding.UTF8.GetBytes($"--{boundary}\r\n"));
            writer.Write(Encoding.UTF8.GetBytes("Content-Disposition: form-data; name=\"body\"\r\n"));
            writer.Write(Encoding.UTF8.GetBytes("Content-Type: application/json\r\n\r\n"));
            writer.Write(jsonBytes);
            writer.Write(Encoding.UTF8.GetBytes("\r\n"));

            // 写入文件部分
            writer.Write(Encoding.UTF8.GetBytes($"--{boundary}\r\n"));
            writer.Write(Encoding.UTF8.GetBytes($"Content-Disposition: form-data; name=\"file\"; filename=\"{fileName}\"\r\n"));
            writer.Write(Encoding.UTF8.GetBytes("Content-Type: text/plain\r\n\r\n")); // 根据文件类型调整Content-Type
            writer.Write(fileBytes);
            writer.Write(Encoding.UTF8.GetBytes("\r\n"));

            // 写入结束边界
            writer.Write(Encoding.UTF8.GetBytes($"--{boundary}--\r\n"));
        }

        try
        {
            var httpResponse = (System.Net.HttpWebResponse)webRequest.GetResponse();
            using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
            {
                var result = streamReader.ReadToEnd();
                Console.WriteLine(result.ToString());
            }
        }
        catch (System.Net.WebException ex)
        {
            // 处理请求异常,比如获取错误响应内容
            using (var errorStream = new StreamReader(ex.Response.GetResponseStream()))
            {
                Console.WriteLine("请求错误:" + errorStream.ReadToEnd());
            }
        }
    }
}

关键修改点说明

  • 边界一致性:确保ContentType中的边界和代码中使用的边界字符串完全一致,这是multipart格式被服务端正确识别的核心。
  • 内容块结构:每个内容块(JSON和文件)都需要以--{boundary}开头,然后是Content-Disposition头(指定参数名,文件还要附加文件名),接着是Content-Type头,空一行后才是内容本身。
  • 字节流写入:改用BinaryWriter直接写入字节数组,避免StreamWriter的编码自动转换可能带来的格式问题,确保请求内容完全符合规范。
  • 异常处理:增加了WebException捕获逻辑,方便调试请求失败的场景,能直接获取服务端返回的错误信息。
  • Content-Type适配:文件部分的Content-Type可以根据实际文件类型调整,比如图片用image/jpeg、Excel用application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,这里用text/plain适配txt文件。

内容的提问来源于stack exchange,提问作者user9256499

火山引擎 最新活动