http post 使用multipart/form-data 格式数据 上传文件(图片)

由于工作上的需求,这两天对接了个php的接口,上传文件必须使用固定格式,下面看下需要上传的格式,从图片中可以看出,多个图片数据是使用boundary分割的,并且在每个数据体内(即从分割符到下一个分割符),除了name以外,还必须拼接特定字段,例如pictype isurl等等,这个比较重要,因为使用RestTemplate 和hettpClient方式,无法拼接该字符(本人确实第一次写,如果哪位大神可以用这两种方式写出来,希望能够留言,交流学习)
在这里插入图片描述

下面来说下如何解决该类问题的
首先在使用httpclient和RestTemplate时候,拼接header,实体数据没任何问题,问题出现在了分割符,以及每个实体里面Content-Dispositon 的内容,这两种方式我没有找到好的方式来填充自定义的值,http里面可以很好解决该问题,因为可以自定义内容,下面是主要代码

			//随便定义分割符
 			String boundary="--7daf10c20d06";
            URL urlCon=new URL(url);
            HttpURLConnection connection= (HttpURLConnection) urlCon.openConnection();
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Host","xxxxx");
            connection.setRequestProperty("Accept","image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*");
            connection.setRequestProperty("Accept-Language","zh-cn");
            connection.addRequestProperty("Content-Type","multipart/form-data; boundary="+boundary);
            connection.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; CIBA; .NET CLR 2.0.50727)");
            connection.addRequestProperty("Connection","close");
            connection.setRequestProperty("Cache-Control","no-cache");
            connection.addRequestProperty("Charset","UTF-8");
            // 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在
            // http正文内,因此需要设为true, 默认情况下是false;
            connection.setDoOutput(true);
            //设置是否从httpUrlConnection读入,默认情况下是true;
            connection.setDoInput(true);
            // Post 请求不能使用缓存  ?
            connection.setUseCaches(false);
            connection.setConnectTimeout(20000);
            connection.connect();

            StringBuilder contentBody1 = new StringBuilder();
            StringBuilder contentBody2 = new StringBuilder();
            StringBuilder contentBody3= new StringBuilder();
            DataOutputStream dataOutputStream=new DataOutputStream(connection.getOutputStream());
            //这里我将url转换成二进制流
            byte[] bytes = httpDownloadServer.downloadImage("xxx.jpg");
            byte[] end_data=("\r\n----7daf10c20d06--\r\n").getBytes();
            String json = "{ sName:\"张三\", sNation:\"test\", sBirthDate:\"2016-01-30\", sAddress:\"南山区\", sIdNumber:\"13301112345\", sStartDate:\"2017-01-30 23:00:00\", sEndDate:\"2017-02-30\",sCheckDate:\"2017-01-30 23:00:00\", iResult:0, bAlarm:true, sRec:\"\"} ";
            
            //第一部分 特别注意,自定义拼接以定要按照该格式,回车换行,\r\n一定按照下面格式来,缺少一个都会报500错误
            contentBody1.append("--"+boundary);
            contentBody1.append("\r\n");
            contentBody1.append("Content-Disposition:form-data;name=\"userfile\";pictype=0&isurl=1&piclen=10011;filename=\"1.jpg\"");
            contentBody1.append("\r\n");
            contentBody1.append("Content-Type:image/jpeg");
            contentBody1.append("\r\n");
            contentBody1.append("\r\n");
            dataOutputStream.write(contentBody1.toString().getBytes());

            dataOutputStream.write(bytes, 0, bytes.length);
            dataOutputStream.write("\r\n".getBytes());


            //第二部分
            contentBody2.append("--"+boundary);
            contentBody2.append("\r\n");
            contentBody2.append("Content-Disposition:form-data;name=\"userfile\";pictype=1&isurl=1&piclen=10011;filename=\"2.jpg\"");
            contentBody2.append("\r\n");
            contentBody2.append("Content-Type:image/jpeg");
            contentBody2.append("\r\n");
            contentBody2.append("\r\n");
            dataOutputStream.write(contentBody2.toString().getBytes());
            dataOutputStream.write(bytes, 0, bytes.length);
            dataOutputStream.write("\r\n".getBytes());



            //第三部分
            contentBody3.append("--"+boundary);
            contentBody3.append("\r\n");
            contentBody3.append("Content-Disposition:form-data; name=\"userfile\";datatype=json&datalen=126");
            contentBody3.append("\r\n");
            contentBody3.append("Content-Type: text/plain");
            contentBody3.append("\r\n");
            contentBody3.append("\r\n");
            contentBody3.append(json);
            contentBody3.append("\r\n");
            dataOutputStream.write(contentBody3.toString().getBytes());
            dataOutputStream.write(end_data);
            dataOutputStream.flush();

            InputStream inputStream=connection.getInputStream();
            byte[] data=new byte[1024];
            StringBuffer sb1=new StringBuffer();
            int length=0;
            while ((length=inputStream.read(data))!=-1){
                String returns=new String(data, Charset.forName("utf-8"));
                sb1.append(returns);
            }
            String message=sb1.toString();
            System.out.println(message);
            inputStream.close();
            dataOutputStream.close();
            connection.disconnect();

这里就不写url转换二进制代码了,比较简单。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
使用Java进行HTTP POST请求并使用"multipart/form-data"格式,你可以使用Apache HttpClient库。下面是一个示例代码: ```java import java.io.File; import java.io.IOException; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.ContentType; import org.apache.http.entity.mime.HttpMultipartMode; import org.apache.http.entity.mime.MultipartEntityBuilder; import org.apache.http.impl.client.HttpClients; public class MultipartFormDataExample { public static void main(String[] args) throws IOException { String url = "http://example.com/upload"; String filePath = "/path/to/file.txt"; HttpClient httpClient = HttpClients.createDefault(); HttpPost httpPost = new HttpPost(url); MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); // 添加文件参数 File file = new File(filePath); builder.addBinaryBody("file", file, ContentType.DEFAULT_BINARY, file.getName()); HttpEntity multipart = builder.build(); httpPost.setEntity(multipart); HttpResponse response = httpClient.execute(httpPost); // 处理响应... } } ``` 在这个示例中,你需要将`url`替换为你要发送POST请求的URL,将`filePath`替换为你要上传的文件的路径。接下来,我们创建一个`HttpClient`实例和一个`HttpPost`实例。然后,我们使用`MultipartEntityBuilder`来构建"multipart/form-data"格式的请求实体,将文件添加为二进制参数。最后,我们将请求实体设置到`HttpPost`实例中,并发送请求。 请注意,这个示例使用的是Apache HttpClient 4.x版本。如果你使用的是不同的HTTP客户端库,请查阅其文档以获取相应的实现方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值