httpClient 使用multipart/form-data 类型上传文件及表单

本文介绍了一个使用Java进行HTTP POST请求的具体实现方式,包括设置代理、Header信息、上传文件等步骤,并特别强调了multipart/form-data类型中boundary参数的重要性。
public static void post() throws ClientProtocolException, IOException {
//          	Proxy p=new Proxy();
//		p.setHost("192.168.1.153");
//		p.setPort("8888");
    	
        HttpClient httpclient = new DefaultHttpClient();
        
//        HttpHost proxy = new HttpHost(p.getHost(), Integer.valueOf(p.getPort()), "http"); 
//        httpclient.getParams().setParameter(ConnRouteParams.DEFAULT_PROXY, proxy);
        //请求路径
        HttpPost post = new HttpPost("xxxxx");
//添加header头信息
        post.setHeader("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;)");
//注 这里一定不能添加 content-Type:multipart/form-data 属性 因为这里面有个boundary参数属性是不可控的。这个值是由浏览器生成的。如果强行指明和可能
//导致边界值不一致 就会请求失败 详细参见 http://blog.youkuaiyun.com/xiaojianpitt/article/details/6856536

//      post.setHeader("content-Type", "multipart/form-data");
        post.setHeader("Host", "****");
        post.setHeader("Accept-Encoding","gzip");
        post.setHeader("charset", "utf-8");
        FileBody fileBody = new FileBody(new File("xxxx"),"image/pjpeg","utf-8");
        MultipartEntity entity = new MultipartEntity();
//添加消息体信息       
        entity.addPart("xxxx", new StringBody("xxx",Charset.forName("utf-8")));
        entity.addPart("imagefile", fileBody);
        post.setEntity(entity);
        HttpResponse response = httpclient.execute(post);  
        if(HttpStatus.SC_OK==response.getStatusLine().getStatusCode()){    
              
            HttpEntity entitys = response.getEntity();  
            if (entity != null) {  
                System.out.println(EntityUtils.toString(entitys));  
            }  
        }  
        httpclient.getConnectionManager().shutdown();  
    }


如果设置了content-Type: multipart/form-data

可以使用抓包工具拦截请求


这是是缺少boundary参数的

正常的应该是存在的(边界值不一样就会导致content-length=0 就是发送的消息体是空的)





                
在C#中使用 `multipart/form-data` 格式上传文件时,通常依赖 `HttpClient` 类来构造和发送请求。由于 C# 并没有直接提供处理 `multipart/form-data` 的标准库,因此需要手动构造请求体,或者使用高级封装方法。 以下是一个使用 `HttpClient` 和 `MultipartFormDataContent` 类实现文件上传的示例代码: ```csharp using System; using System.IO; using System.Net.Http; using System.Threading.Tasks; class Program { static async Task Main(string[] args) { var client = new HttpClient(); // 文件路径 string filePath = @"C:\path\to\your\file.txt"; // 读取文件为字节数组 byte[] fileBytes = File.ReadAllBytes(filePath); // 构造 multipart/form-data 请求体 using (var content = new MultipartFormDataContent()) { // 添加文件部分 var fileContent = new ByteArrayContent(fileBytes); fileContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream"); content.Add(fileContent, "file", "file.txt"); // "file" 是表单字段名,"file.txt" 是上传文件名 // 添加其他文本字段(可选) content.Add(new StringContent("example_value"), "field_name"); // 发送 POST 请求 HttpResponseMessage response = await client.PostAsync("https://example.com/upload", content); // 输出响应结果 Console.WriteLine(await response.Content.ReadAsStringAsync()); } } } ``` 该示例中使用了 `MultipartFormDataContent` 来构造请求体,并通过 `ByteArrayContent` 将文件内容作为 `multipart/form-data` 的一部分添加进去。如果需要上传多个文件或附加文本字段,可以多次调用 `content.Add()` 方法[^1]。 如果需要更精细的控制,例如手动设置边界(boundary)或构造完整的 `multipart/form-data` 请求体,可以使用 `StreamContent` 和自定义格式化逻辑。这种方式适用于需要完全控制请求格式的高级场景。 ### 文件上传使用 multipart/form-data 的原因 `multipart/form-data` 是一种专门设计用于在 HTTP 请求中传输多种类型数据(包括文件)的编码方式。它通过将数据分割为多个部分(parts),每个部分可以包含不同类型的内容(如文本字段和二进制文件),并使用边界(boundary)分隔符进行标识。这种方式确保了服务器能够正确解析混合数据,包括文本和二进制文件[^3]。 ### 适用场景 - **HTML 表单上传文件**:当使用 `<input type="file">` 元素时,浏览器会自动以 `multipart/form-data` 格式提交数据。 - **混合数据传输**:当需要同时上传文本字段(如用户名)和文件(如头像)时。 - **大文件上传**:`multipart/form-data` 支持二进制直传,减少了编码转换带来的带宽浪费,并且可以结合分块传输实现断点续传。 ---
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值