【.net/.net core】使用form-data方式发起post请求

本文介绍了如何在.NET中使用HttpClient发送POST请求,携带File类型的文件和普通参数,通过MultipartFormDataContent构建multipart/form-data请求体,包括了下载图片、文件流转字节数组及网络图片下载并转换为字节数组的过程。
摘要由CSDN通过智能技术生成

 使用场景:一般为在发起请求时,需要带着文件对象,即File类型参数。

public async void  PostByFormData() {
            //创建一个MultipartFormDataContent对象,构建multipart/form-data请求体
            MultipartFormDataContent pushMemberParams = new MultipartFormDataContent();
            string fileUrl= "https://localhost:8081/image/123.png";//模拟网络图片/文件

            // 使用HttpClient获取图片/文件数据
            byte[] fileBtyes = await DownloadImageBytes(fileUrl);

            // 创建HttpClient实例
            HttpClient client = new HttpClient();
            // 添加文件内容到multipart/form-data内容中
            pushMemberParams.Add(new StreamContent(new MemoryStream(fileBtyes )), "fileKey", "123.png");//此处需注意,文件需要添加为流内容,需要先将字节数组转换为流类型,然后添加
            pushMemberParams.Add(new StringContent("张三"), "Name");
            var response = await client.PostAsync("https://localhost:8082/saveFile", pushMemberParams);//https://localhost:8082/saveFil为处理请求接口地址
            // 确保响应成功
            response.EnsureSuccessStatusCode();
            // 读取响应内容
            var responseBody = await response.Content.ReadAsStringAsync();
            //需要返回内容可在此处添加,对应需要修改方法的返回类型
        }

将文件流转换为字节数组方法

/// <summary>
        /// 将文件流转换为字节数组
        /// </summary>
        /// <param name="filePath"></param>
        /// <returns></returns>
        public byte[] ConvertFileStreamToByteArray(string filePath)
        {
            // 创建一个FileStream对象来读取文件
            using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
            {
                // 获取文件的大小
                int length = (int)fileStream.Length;
                byte[] byteArray = new byte[length];

                // 从文件流中读取数据到字节数组中
                fileStream.Read(byteArray, 0, length);
                return byteArray;
            }
        }

将网络图片地址转换为字节数组方法

/// <summary>
        /// 下载图片
        /// </summary>
        /// <param name="imageUrl"></param>
        /// <returns></returns>
        static async Task<byte[]> DownloadImageBytes(string imageUrl)
        {
            using (HttpClient client = new HttpClient())
            {
                // 发起GET请求
                HttpResponseMessage response = await client.GetAsync(imageUrl);
                response.EnsureSuccessStatusCode(); // 检查响应状态码是否成功
                byte[] imageBytes = await response.Content.ReadAsByteArrayAsync(); // 读取内容为字节数组
                return imageBytes;
            }
        }

可能是因为SpringBoot默认情况下只会解析application/x-www-form-urlencoded格式的请求体,而不会解析multipart/form-data格式的请求体。如果你想要支持multipart/form-data格式的请求体,可以尝试添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-artemis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web-services</artifactId> </dependency> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-core</artifactId> <version>2.3.0.1</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.3.0.1</version> </dependency> <dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-xjc</artifactId> <version>2.3.0.1</version> </dependency> ``` 同时,在SpringBoot的配置文件中添加以下配置: ```properties spring.servlet.multipart.enabled=true spring.servlet.multipart.file-size-threshold=2MB spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=100MB ``` 这样就可以支持multipart/form-data格式的请求体了。如果还有问题,可以提供更详细的错误信息或代码,我会尽力帮助你解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值