java HttpURLConnection 发送文件和字符串信息

网友投稿 434 2023-05-06


java HttpURLConnection 发送文件和字符串信息

java HttpURLConnection 发送文件和字符串信息

以文件的形式传参

/**

* 通过拼接的方式构造请求内容,实现参数传输以及文件传输

*

* @param actionUrl 访问的服务器URL

* @param params 普通参数

* @param files 文件参数

* @return

* @throws IOException

*/

public static void post(String actionUrl, Map params, Map files) throws IOException

{

String BOUNDARY = java.util.UUID.randomUUID().toString();

String PREFIX = "--", LINEND = "\r\n";

String MULTIPART_FROM_DATA = "multipart/form-data";

String CHARSET = "UTF-8";

URL uri = new URL(actionUrl);

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

conn.setReadTimeout(5 * 1000); // 缓存的最长时间

conn.setDoInput(true);// 允许输入

conn.setDoOutput(true);// 允许输出

conn.setUseCaches(false); // 不允许使用缓存

conn.setRequestMethod("POST");

conn.setRequestProperty("connection", "keep-alive");

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

conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA + ";boundary=" + BOUNDARY);

// 首先组拼文本类型的参数

StringBuilder sb = new StringBuilder();

for (Map.Entry entry : params.entrySet())

{

sb.append(PREFIX);

sb.append(BOUNDARY);

sb.append(LINEND);

sb.append("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"" + LINEND);

sb.append("Content-Type: text/plain; charset=" + CHARSET + LINEND);

sb.append("Content-Transfer-Encoding: 8bit" + LINEND);

sb.append(LINEND);

sb.append(entry.getValue());

http:// sb.append(LINEND);

}

DataOutputStream outStream = new DataOutputStream(conn.getOutputStream());

outStream.write(sb.toString().getBytes());

InputStream in = null;

// 发送文件数据

if (files != null)

{

for (Map.Entry file : files.entrySet())

{

StringBuilder sb1 = new StringBuilder();

sb1.append(PREFIX);

sb1.append(BOUNDARY);

sb1.append(LINEND);

// name是post中传参的键 filename是文件的名称

sb1.append("Content-Disposition: form-data; name=\"file\"; filename=\"" + file.getKey() + "\"" + LINEND);

sb1.append("Content-Type: application/octet-stream; charset=" + CHARSET + LINEND);

sb1.append(LINEND);

outStream.write(sb1.toString().getBytes());

InputStream is = new FileInputStream(file.getValue());

byte[] buffer = new byte[1024];

int len = 0;

while ((len = is.read(buffer)) != -1)

{

outStream.write(buffer, 0, len);

}

is.close();

outStream.write(LINEND.getBytes());

}

// 请求结束标志

byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();

outStream.write(end_data);

outStream.flush();

// 得到响应码

int res = conn.getResponseCode();

if (res == 200)

{

in = conn.getInputShttp://tream();

int ch;

StringBuilder sb2 = new StringBuilder();

while ((ch = in.read()) != -1)

{

sb2.apphttp://end((char) ch);

}

}

outStream.close();

conn.disconnect();

}

// return in.toString();

}

以数据流的形式传参

public static String postFile(String actionUrl, Map params, Map files)

throws Exception

{

StringBuilder sb2 = null;

String BOUNDARY = java.util.UUID.randomUUID().toString();

String PREFIX = "--", LINEND = "\r\n";

String MULTIPART_FROM_DATA = "multipart/form-data";

String CHARSET = "UTF-8";

URL uri = new URL(actionUrl);

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

conn.setReadTimeout(6 * 1000); // 缓存的最长时间

conn.setDoInput(true);// 允许输入

conn.setDoOutput(true);// 允许输出

conn.setUseCaches(false); // 不允许使用缓存

conn.setRequestMethod("POST");

conn.setRequestProperty("connection", "keep-alive");

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

conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA + ";boundary=" + BOUNDARY);

// 首先组拼文本类型的参数

StringBuilder sb = new StringBuilder();

for (Map.Entry entry : params.entrySet())

{

sb.append(PREFIX);

sb.append(BOUNDARY);

sb.append(LINEND);

sb.append("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"" + LINEND);

sb.append("Content-Type: text/plain; charset=" + CHARSET + LINEND);

sb.append("Content-Transfer-Encoding: 8bit" + LINEND);

sb.append(LINEND);

sb.append(entry.getValue());

sb.append(LINEND);

}

DataOutputStream outStream = new DataOutputStream(conn.getOutputStream());

outStream.write(sb.toString().getBytes());

InputStream in = null;

// 发送文件数据

if (files != null)

{

for (Map.Entry file : files.entrySet())

{

StringBuilder sb1 = new StringBuilder();

sb1.append(PREFIX);

sb1.append(BOUNDARY);

sb1.append(LINEND);

sb1.append("Content-Disposition: form-data; name=\"pic\"; filename=\"" + file.getKey() + "\"" + LINEND);

sb1.append("Content-Type: application/octet-stream; charset=" + CHARSET + LINEND);

sb1.append(LINEND);

outStream.write(sb1.toString().getBytes());

// InputStream is = new FileInputStream(file.getValue());

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

// int len = 0;

// while ((len = is.read(buffer)) != -1)

// {

// outStream.write(buffer, 0, len);

// }

// is.close();

outStream.write(file.getValue());

outStream.write(LINEND.getBytes());

}

// 请求结束标志

byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();

outStream.write(end_data);

outStream.flush();

// 得到响应码

int res = conn.getResponseCode();

if (res == 200)

{

in = conn.getInputStream();

int ch;

sb2 = new StringBuilder();

while ((ch = in.read()) != -1)

{

sb2.append((char) ch);

}

System.out.println(sb2.toString());

}

outStream.close();

conn.disconnect();

// 解析服务器返回来的数据

return Parsejson.getEditMadIconResult(sb2.toString());

}

else

{

return "Update icon Fail";

}

// return in.toString();

}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:简单谈谈ThreadPoolExecutor线程池之submit方法
下一篇:详谈Java中的Object、T(泛型)、?区别
相关文章

 发表评论

暂时没有评论,来抢沙发吧~