用Java模拟multipart形式的Http Post请求

本例通过java模拟了Http的request请求,请求格式为multipart,实现了向服务器同时传递json数据和图片数据。

 1 import java.io.ByteArrayOutputStream;
 2 import java.io.File;
 3 import java.io.FileInputStream;
 4 import java.io.FileNotFoundException;
 5 import java.io.IOException;
 6 import java.io.InputStream;
 7 import java.io.OutputStream;
 8 import java.net.HttpURLConnection;
 9 import java.net.MalformedURLException;
10 import java.net.URL;
11 
12 public class HttpMultipartTest {
13     static String boundary = "abcde12345";
14     static String prefix = "--";
15     static String newLine = "\r\n";
16 
17     public static void main(final String args[]) {
18         test();
19     }
20 
21     private static void test() {
22         try {
23             URL url = new URL("http://127.0.0.1:8080/httpMultipartTestServer/App/testMultipart");
24             HttpURLConnection connection = (HttpURLConnection)url.openConnection();
25             connection.setDoInput(true);
26             connection.setDoOutput(true);
27             connection.setRequestProperty("Content-type", "multipart/form-data;boundary=" + boundary);
28             ConfigHttpMultipart(connection.getOutputStream());
29             InputStream ins = connection.getInputStream();
30             byte[] b = readBuffer(ins);
31             System.out.println(new String(b));
32         } catch (MalformedURLException e) {
33             System.out.println(" url error! ");
34         } catch (IOException e) {
35             System.out.println(" io error! ");
36         }
37     }
38 
39     private static void ConfigHttpMultipart(final OutputStream out) {
40         StringBuffer params = new StringBuffer();
41         params.append(prefix + boundary + newLine);
42         params.append("Content-Disposition: form-data; name=\"jsonData\"");
43         params.append(newLine + newLine);
44         String jsonData = "{\"test\":\"test message!\"}";
45         params.append(jsonData);
46         params.append(newLine);
47         params.append(prefix + boundary + newLine);
48         params.append("Content-Disposition: form-data; name=\"signature\"; filename=\"test.jpg\"");
49         params.append(newLine);
50         params.append("Content-Type: image/pjpeg");
51         params.append(newLine + newLine);
52         File file = new File("C://test.jpg");
53         try {
54             InputStream in = new FileInputStream(file);
55             out.write(params.toString().getBytes());
56             out.write(readBuffer(in));
57             out.write(newLine.getBytes());
58             out.write((prefix + boundary + prefix + newLine).getBytes());
59             out.flush();
60             out.close();
61         } catch (FileNotFoundException e) {
62             System.out.println(" no file! ");
63         } catch (IOException e) {
64             System.out.println(" io error! ");
65         }
66     }
67 
68     public static byte[] readBuffer(final InputStream ins) throws IOException {
69         byte b[] = new byte[1024];
70         ByteArrayOutputStream stream = new ByteArrayOutputStream();
71         int len = 0;
72         while ((len = ins.read(b)) != -1) {
73             stream.write(b, 0, len);
74         }
75         return stream.toByteArray();
76     }
77 }

 

转载于:https://www.cnblogs.com/kouen/archive/2013/06/13/3134347.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过JavaHttpURLConnection类模拟multipart/form-data的方式上传网络上的链接地址文件,具体步骤如下: 1. 构造请求参数 首先,需要构造一个包含文件流和其他参数的请求体。可以使用Java中的MultipartEntityBuilder类来构造multipart/form-data格式的请求体。例如,以下代码可以构造一个包含文件流和一个name参数的请求体: ``` MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create(); multipartEntityBuilder.addBinaryBody("file", new URL(fileUrl).openStream(), ContentType.DEFAULT_BINARY, fileName); multipartEntityBuilder.addTextBody("name", "value"); HttpEntity httpEntity = multipartEntityBuilder.build(); ``` 其中,fileUrl是文件的链接地址,fileName是文件的名称。 2. 创建连接并设置请求头 接下来,需要创建一个HttpURLConnection对象,并设置请求头。具体来说,需要设置Content-Type为multipart/form-data,并设置boundary参数,这个参数用来分隔不同的请求体部分。例如,以下代码可以创建一个连接并设置请求头: ``` URL url = new URL(uploadUrl); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); connection.setDoOutput(true); ``` 其中,uploadUrl是上传接口的地址,boundary是自定义的分隔符。 3. 发送请求 发送请求时,需要将请求体写入到输出流中。例如,以下代码可以将请求体写入到输出流中: ``` OutputStream outputStream = connection.getOutputStream(); httpEntity.writeTo(outputStream); ``` 4. 处理响应 最后,接收响应并处理。例如,以下代码可以读取响应: ``` InputStream inputStream = connection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } ``` 注意:以上代码只是简单示例,实际使用时需要根据具体情况进行调整。同时,如果上传的文件比较大,需要考虑分块上传等优化措施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值