发送端:

/**

* 以流的方式

* 发送文件和json对象

*

* @return

*/

public static String doPostFileStreamAndJsonObj(String url, List fileList, JSONObject json) {

String result = "";//请求返回参数

String jsonString = json.toJSONString();//获得jsonstirng,或者toString都可以,只要是json格式,给了别人能解析成json就行

// System.out.println("================");

// System.out.println(xml);//可以打印出来瞅瞅

// System.out.println("================");

try {

//开始设置模拟请求的参数,额,不一个个介绍了,根据需要拿

String boundary = "------WebKitFormBoundaryUey8ljRiiZqhZHBu";

URL u = new URL(url);

HttpURLConnection conn = (HttpURLConnection) u.openConnection();

conn.setDoOutput(true);

conn.setDoInput(true);

conn.setUseCaches(false);

conn.setRequestMethod("POST");

conn.setRequestProperty("connection", "Keep-Alive");

//这里模拟的是火狐浏览器,具体的可以f12看看请求的user-agent是什么

conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");

conn.setRequestProperty("Charsert", "UTF-8");

//这里的content-type要设置成表单格式,模拟ajax的表单请求

conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);

// 指定流的大小,当内容达到这个值的时候就把流输出

conn.setChunkedStreamingMode(10240000);

//定义输出流,有什么数据要发送的,直接后面append就可以,记得转成byte再append

OutputStream out = new DataOutputStream(conn.getOutputStream());

byte[] end_data = ("\r\n--" + boundary + "--\r\n").getBytes();// 定义最后数据分隔线

StringBuilder sb = new StringBuilder();

//添加form属性

sb.append("--");

sb.append(boundary);

sb.append("\r\n");

//这里存放要传输的参数,name = xml

sb.append("Content-Disposition: form-data; name=\"JsonObj\"");

sb.append("\r\n\r\n");

//把要传的json字符串放进来

sb.append(jsonString);

out.write(sb.toString().getBytes("utf-8"));

out.write("\r\n".getBytes("utf-8"));

int leng = fileList.size();

for (int i = 0; i < leng; i++) {

File file = new File(fileList.get(i));

if(file.exists()){

sb = new StringBuilder();

sb.append("--");

sb.append(boundary);

sb.append("\r\n");

//这里的参数啥的是我项目里对方接收要用到的,具体的看你的项目怎样的格式

sb.append("Content-Disposition: form-data;name=\"File"

+ "\";filename=\"" + file.getName() + "\"\r\n");

//这里拼接个fileName,方便后面用第一种方式接收(如果是纯文件,不带其他参数,就可以不用这个了,因为Multipart可以直接解析文件)

sb.append("FileName:"+ file.getName() + "\r\n");

//发送文件是以流的方式发送,所以这里的content-type是octet-stream流

sb.append("Content-Type:application/octet-stream\r\n\r\n");

byte[] data = sb.toString().getBytes();

out.write(data);

DataInputStream in = new DataInputStream(new FileInputStream(file));

int bytes = 0;

byte[] bufferOut = new byte[1024];

while ((bytes = in.read(bufferOut)) != -1) {

out.write(bufferOut, 0, bytes);

}

int j = i + 1;

if (leng > 1 && j != leng) {

out.write("\r\n".getBytes()); // 多个文件时,二个文件之间加入这个

}

in.close();

}else{

System.out.println("没有发现文件");

}

}

//发送流

out.write(end_data);

out.flush();

out.close();

// 定义BufferedReader输入流来读取URL的响应

BufferedReader reader = new BufferedReader(new InputStreamReader(

conn.getInputStream()));

String line = "";

while ((line = reader.readLine()) != null) {

result += line;

}

// System.out.println("================");

// System.out.println(result.toString());//可以把结果打印出来瞅瞅

// System.out.println("================");

//后面可以对结果进行解析(如果返回的是格式化的数据的话)

} catch (Exception e) {

System.out.println("发送POST请求出现异常!" + e);

e.printStackTrace();

}

return result;

}

----------------------------------

发送端测试类

public static void main(String args[]) throws Exception {

//模拟流文件及参数上传

String url = "http://127.0.0.1:8090/kty/test/receiveStream";

//文件列表,搞了三个本地文件

List fileList = new ArrayList<>();

fileList.add("F:\\me\\photos\\动漫\\3ba39425fec1965f4d088d2f.bmp");

fileList.add("F:\\me\\photos\\动漫\\09b3970fd3f5cc65b1351da4.bmp");

fileList.add("F:\\me\\photos\\动漫\\89ff57d93cd1b72cd0164ec9.bmp");

//json字符串,模拟了一个,传图片名字吧

String jsonString = "{\n" +

" \"token\": \"stream data\", \n" +

" \"content\": [\n" +

" {\n" +

" \"id\": \"1\", \n" +

" \"name\": \"3ba39425fec1965f4d088d2f.bmp\"\n" +

" }, \n" +

" {\n" +

" \"id\": \"2\", \n" +

" \"name\": \"09b3970fd3f5cc65b1351da4.bmp\"\n" +

" }, \n" +

" {\n" +

" \"id\": \"3\", \n" +

" \"name\": \"89ff57d93cd1b72cd0164ec9.bmp\"\n" +

" }\n" +

" ]\n" +

"}";

JSONObject json = JSONObject.parseObject(jsonString);

doPostFileStreamAndJsonObj(url, fileList, json);

}

-----------------------------------------

接收端:

@RestController

@RequestMapping("/test")

//跨域注解

@CrossOrigin

public class TestController {

/**

* 接收流信息

*

* @param request

* @return

*/

@PostMapping("/receiveStream")

public String receiveStream(HttpServletRequest request) {

String result = "";

System.out.println("进来了");

try {

//获取request里的所有部分

Collection parts = request.getParts();

for (Iterator iterator = parts.iterator(); iterator.hasNext(); ) {

Part part = iterator.next();

System.out.println("名称========" + part.getName());

if ("JsonObj".equals(part.getName())) {

//解析json对象

BufferedReader reader = new BufferedReader(new InputStreamReader(part.getInputStream()));

String line = "";

String parseString = "";

while ((line = reader.readLine()) != null) {

parseString += line;

}

JSONObject json = JSONObject.parseObject(parseString);

System.out.println("接收到的json对象为=====" + json.toJSONString());

} else if ("File".equals(part.getName())) {

String fileName = "";

Long size = part.getSize();

//文件名的获取,可以直接获取header里定义好的FIleName(大部分没有),或从Content-Disposition去剪切出来

// String head = part.getHeader("Content-Disposition");

// fileName = head.substring(head.indexOf("filename=")+ 10, head.lastIndexOf("\""));

fileName = part.getHeader("FileName");

System.out.println(fileName + size);

// //这里就是文件,文件流就可以直接写入到文件了

// InputStream inputStream = part.getInputStream();

// OutputStream outputStream = new FileOutputStream(fileName);

// int bytesWritten = 0;

// int byteCount = 0;

// byte[] bytes = new byte[1024];

// while ((byteCount = inputStream.read(bytes)) != -1) {

// outputStream.write(bytes, bytesWritten, byteCount);

// bytesWritten += byteCount;

// }

// inputStream.close();

// outputStream.close();

}

}

//如果嫌上面获取文件的麻烦,用下面这个比较简单,解析成multipartFile

MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;

//统计文件数

Integer fileCount = 0;

//请求里key为File的元素(即文件元素)

List list = multiRequest.getFiles("File");

while (fileCount < list.size()) {

MultipartFile file = list.get(fileCount);

System.out.println(file.getName());

System.out.println(file.getOriginalFilename());

System.out.println(file.getSize());

fileCount++;

}

System.out.println("共有" + fileCount + "个文件");

} catch (Exception e) {

e.printStackTrace();

}

return result;

}

}

java http 流_java 模拟http请求,通过流(stream)的方式,发送json数据和文件相关推荐

  1. java给第三方接口发送数据_对接第三方接口--使用post请求发送json数据

    对接第三方接口–使用post请求发送json数据 实习4个多月,终于转正!终于可以安心好好上班,好好学习!第一篇播客记录下工作中的中的小知识点. 本文记录的内容如下: 1.使用HttpClient相关 ...

  2. java http请求 工具类_java模拟http请求调用远程接口工具类

    package ln; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamRea ...

  3. Spring Boot笔记-get请求发送json数据(方便前端vue解析)

    目录 基本概念 代码与实例 基本概念 这里有一个思路,后端只发送Json数据,前端vue去解析.这样的话,就可以做到前后端分离,耦合性就很低了. 代码与实例 程序运行截图如下: 得到后,使用vue去解 ...

  4. php7 mysql json 小程序_微信小程序php传递post请求发送json数据以获取小程序码

    困扰了两天的问题终于解决了! 用php传递post请求,发送json数据到微信小程序提供的接口,以此获得微信小程序码,下面是代码展示:<?php //需要传递的json数据 //能传递的参数,详 ...

  5. java post json请求_java模拟post请求发送json

    java模拟post请求发送json,用两种方式实现,第一种是HttpURLConnection发送post请求,第二种是使用httpclient模拟post请求. 方法一: public stati ...

  6. java chunked 解码_模拟http请求 带 chunked解析办法一

    今天在干坏事抓取别人页面时候遇到一个问题,平时我们在post数据后,大不了要求提交cookie,但是今天这个测试了N遍不需要coookie都行的,但是抓取到的始终是乱码,怎么解析都不行.于是自己又把c ...

  7. java linux 服务_java项目部署Linux服务器几种启动方式总结经验

    一:两种部署包: 部署之前先说下两种包,java项目部署到服务器一般有用war包的,也有用jar包的,微服务spring-cloud普及后大部分打包都是jar,部署之前先搞清楚自己要打war包还是ja ...

  8. Java 用HTTP的方式发送JSON报文请求

    前言: 项目调用第三方接口时,通常是用socket或者http的通讯方式发送请求:http 为短连接,客户端发送请求都需要服务器端回送响应,请求结束后,主动释放链接.Socket为长连接:通常情况下S ...

  9. python接收http请求_python通过get,post方式发送http请求和接收http响应

    您可能感兴趣的话题: python 核心提示: 本文实例讲述了python通过get,post方式发送http请求和接收http响应的方法.分享给大家供大家参考. 本文实例讲述了python通过get ...

最新文章

  1. BZOJ 1124: [POI2008]枪战Maf(构造 + 贪心)
  2. 记事本写python怎么运行-利用Python开发实现简单的记事本
  3. python多线程爬虫实例-Python3多线程爬虫实例讲解代码
  4. 傻瓜式Linux之一:系统安装
  5. PHP Curl多线程原理实例详解
  6. 那些 IT 界的神翻译,原来我学不好编程的原因就在这
  7. Codeforces1142D
  8. 【codevs1281】Xn数列,矩阵乘法练习
  9. java中的基本小程序_12个用Java编写基础小程序经典案例(收藏篇)
  10. IOS ViewController 生命周期
  11. 使用Pls_Integer的好处
  12. server.MapPath的相对路径问题
  13. 彻底告别加解密模块代码拷贝-JCE核心Cpiher详解
  14. 海康威视摄像机修改网络参数报错:SADP.dll[2011]码
  15. 计算机学院吴琴,06年浙江大学计算机与软件学院拒绝报道生名单
  16. 富文本编辑器Editormd的配置使用
  17. 如何解决服务器响应过慢的问题,服务器响应速度慢的处理方法
  18. 计算机管理无法定位程序输入点,win10系统打开程序提示无法定位程序输入点于动态链接库怎么办...
  19. sql server 2008新建视图时出现对象名无效
  20. 义乌中学集训(没打的题慢慢补)

热门文章

  1. 迭代器——STL关键所在
  2. 使用SQL Server 2005作业设置定时任务
  3. 获取传入element在Document中的name相同的elements中的顺序
  4. Mybatis-Plus 使用自定义注入器后,查询条件中不再添加逻辑删除字段限定条件
  5. java scri p t_深入浅析JavaScript中数据共享和数据传递_javascri
  6. 2018-6-19bash编程之循环
  7. 生产库中遇到mysql的子查询
  8. 关于ExtJs4的Grid带 查询 参数 分页(baseParams--extraParams)
  9. Developer Express右键菜单显示汉化
  10. 关于css垂直水平居中的几种方式