博客
关于我
java发送post请求,使用multipart/form-data的方式传递参数,可实现服务器间文件上传功能(转)
阅读量:432 次
发布时间:2019-03-06

本文共 4943 字,大约阅读时间需要 16 分钟。

public static void testUploadImage() {    String url = "http://xxxtest/Api/testUploadModelBaking";    String fileName = "e:/username/textures/antimap_0017.png";        // 创建请求参数    Map
textMap = new HashMap<>(); textMap.put("name", "testname"); textMap.put("type", "2"); // 文件参数 Map
fileMap = new HashMap<>(); fileMap.put("upfile", fileName); // 设置内容类型 String contentType = ""; // 上传文件 String ret = formUpload(url, textMap, fileMap, contentType); System.out.println(ret);}
public static String formUpload(String urlStr, Map
textMap, Map
fileMap, String contentType) { String res = ""; HttpURLConnection conn = null; String BOUNDARY = "---------------------------123821742118716"; try { URL url = new URL(urlStr); conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(5000); conn.setReadTimeout(30000); conn.setDoOutput(true); conn.setDoInput(true); conn.setUseCaches(false); conn.setRequestMethod("POST"); conn.setRequestProperty("Connection", "Keep-Alive"); conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY); OutputStream out = new DataOutputStream(conn.getOutputStream()); // 处理文本参数 if (!textMap.isEmpty()) { StringBuffer strBuf = new StringBuffer(); for (Map.Entry
entry : textMap.entrySet()) { String inputName = entry.getKey(); String inputValue = entry.getValue(); if (inputValue == null) continue; strBuf.append("--").append(BOUNDARY).append("\r\n"); strBuf.append("Content-Disposition: form-data; name=\"").append(inputName).append("\"").append("\r\n\r\n"); strBuf.append(inputValue); } out.write(strBuf.toString().getBytes()); } // 处理文件参数 if (!fileMap.isEmpty()) { for (Map.Entry
entry : fileMap.entrySet()) { String inputName = entry.getKey(); String inputValue = entry.getValue(); if (inputValue == null) continue; File file = new File(inputValue); String filename = file.getName(); // 设置内容类型 if (!"".equals(contentType)) { if (filename.endsWith(".png")) { contentType = "image/png"; } else if (filename.endsWith(".jpg") || filename.endsWith(".jpeg") || filename.endsWith(".jpe")) { contentType = "image/jpeg"; } else if (filename.endsWith(".gif")) { contentType = "image/gif"; } else if (filename.endsWith(".ico")) { contentType = "image/x-icon"; } } if ("".equals(contentType)) { contentType = "application/octet-stream"; } StringBuffer strBuf = new StringBuffer(); strBuf.append("--").append(BOUNDARY).append("\r\n"); strBuf.append("Content-Disposition: form-data; name=\"").append(inputName).append("; filename=\"").append(filename).append("\"").append("\r\n"); strBuf.append("Content-Type: ").append(contentType).append("\r\n\r\n"); out.write(strBuf.toString().getBytes()); DataInputStream in = new DataInputStream(new FileInputStream(file)); byte[] buffer = new byte[1024]; while ((bytes = in.read(buffer)) != -1) { out.write(buffer, 0, bytes); } in.close(); } } // 结束分隔符 byte[] endData = ("--" + BOUNDARY + "--\r\n").getBytes(); out.write(endData); out.flush(); out.close(); // 读取返回数据 StringBuffer strBuf = new StringBuffer(); BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line = null; while ((line = reader.readLine()) != null) { strBuf.append(line).append("\n"); } res = strBuf.toString(); reader.close(); reader = null; } catch (Exception e) { System.out.println("发送POST请求出错:" + urlStr); e.printStackTrace(); } finally { if (conn != null) { conn.disconnect(); conn = null; } } return res;}

代码解释

  • testUploadImage 方法:这是一个用于测试上传图片功能的方法,主要用于发送POST请求上传文件。
  • formUpload 方法:这是一个通用的文件上传方法,接收URL、文本参数、文件参数以及内容类型。
  • 请求参数处理:将文本参数转换为form-data格式,包含Content-Disposition和内容。
  • 文件参数处理:根据文件名设置默认内容类型(如PNG、JPEG等),然后将文件内容添加到请求中。
  • 分隔符处理:使用boundary字符串将请求参数和文件内容分隔开,然后发送请求。
  • 返回数据处理:读取服务器返回的数据并输出结果。

转载地址:http://pxbyz.baihongyu.com/

你可能感兴趣的文章
netty底层源码探究:启动流程;EventLoop中的selector、线程、任务队列;监听处理accept、read事件流程;
查看>>
Netty核心模块组件
查看>>
Netty框架的服务端开发中创建EventLoopGroup对象时线程数量源码解析
查看>>
Netty源码—2.Reactor线程模型一
查看>>
Netty源码—4.客户端接入流程一
查看>>
Netty源码—4.客户端接入流程二
查看>>
Netty源码—5.Pipeline和Handler一
查看>>
Netty源码—6.ByteBuf原理二
查看>>
Netty源码—7.ByteBuf原理三
查看>>
Netty源码—7.ByteBuf原理四
查看>>
Netty源码—8.编解码原理二
查看>>
Netty源码解读
查看>>
Netty的Socket编程详解-搭建服务端与客户端并进行数据传输
查看>>
Netty相关
查看>>
Network Dissection:Quantifying Interpretability of Deep Visual Representations(深层视觉表征的量化解释)
查看>>
Network Sniffer and Connection Analyzer
查看>>
NetworkX系列教程(11)-graph和其他数据格式转换
查看>>
Networkx读取军械调查-ITN综合传输网络?/读取GML文件
查看>>
Net与Flex入门
查看>>
net包之IPConn
查看>>