利用HttpURLConnection发送post请求上传多个文件

简介:

本文要用java.net.HttpURLConnection来实现多个文件上传

1. 研究 form 表单到底封装了什么样的信息发送到servlet。

假如我参数写的内容是hello word,然后二个文件是二个简单的txt文件,form提交的信息为:

[xhtml]  view plain copy
  1. -----------------------------7da2e536604c8    
  2. Content-Disposition: form-data; name="username"    
  3.     
  4. hello word    
  5. -----------------------------7da2e536604c8    
  6. Content-Disposition: form-data; name="file1"filename="D:/haha.txt"    
  7. Content-Type: text/plain    
  8.     
  9. haha    
  10.   hahaha    
  11. -----------------------------7da2e536604c8    
  12. Content-Disposition: form-data; name="file2"filename="D:/huhu.txt"    
  13. Content-Type: text/plain    
  14.     
  15. messi     
  16. huhu    
  17. -----------------------------7da2e536604c8--    
 

 

研究下规律发现有如下几点特征

1.第一行是“ -----------------------------7d92221b604bc ”作为分隔符,然后是“ /r/n ” 回车换行符。 这个7d92221b604bc 分隔符浏览器是随机生成的。

2.第二行是Content-Disposition: form-data; name="file2"; filename="D:/huhu.txt";name=对应input的name值,filename对应要上传的文件名(包括路径在内),

3.第三行如果是文件就有Content-Type: text/plain;这里上传的是txt文件所以是text/plain,如果上穿的是jpg图片的话就是image/jpg了,可以自己试试看看。

然后就是回车换行符。

4.在下就是文件或参数的内容或值了。如:hello word。

5.最后一行是-----------------------------7da2e536604c8--,注意最后多了二个--;

有了这些就可以使用HttpURLConnection来实现上传文件功能了

[java]  view plain copy
  1. private void upload(String[] uploadFiles, String actionUrl) {  
  2.       String end = "/r/n";  
  3.       String twoHyphens = "--";  
  4.       String boundary = "*****";  
  5.       try {  
  6.           URL url = new URL(actionUrl);  
  7.           HttpURLConnection con = (HttpURLConnection) url.openConnection();  
  8.            // 发送POST请求必须设置如下两行    
  9.           con.setDoInput(true);  
  10.           con.setDoOutput(true);  
  11.           con.setUseCaches(false);  
  12.           con.setRequestMethod("POST");  
  13.           con.setRequestProperty("Connection""Keep-Alive");  
  14.           con.setRequestProperty("Charset""UTF-8");  
  15.           con.setRequestProperty("Content-Type",  
  16.                   "multipart/form-data;boundary=" + boundary);  
  17.           DataOutputStream ds =  
  18.                   new DataOutputStream(con.getOutputStream());  
  19.           for (int i = 0; i < uploadFiles.length; i++) {  
  20.               String uploadFile = uploadFiles[i];  
  21.               String filename = uploadFile.substring(uploadFile.lastIndexOf("//") + 1);  
  22.               ds.writeBytes(twoHyphens + boundary + end);  
  23.               ds.writeBytes("Content-Disposition: form-data; " +  
  24.                       "name=/"file" + i + "/";filename=/"" +  
  25.                       filename + "/"" + end);  
  26.               ds.writeBytes(end);  
  27.               FileInputStream fStream = new FileInputStream(uploadFile);  
  28.               int bufferSize = 1024;  
  29.               byte[] buffer = new byte[bufferSize];  
  30.               int length = -1;  
  31.               while ((length = fStream.read(buffer)) != -1) {  
  32.                   ds.write(buffer, 0, length);  
  33.               }  
  34.               ds.writeBytes(end);  
  35.               /* close streams */  
  36.               fStream.close();  
  37.           }  
  38.           ds.writeBytes(twoHyphens + boundary + twoHyphens + end);  
  39.           ds.flush();  
  40.           // 定义BufferedReader输入流来读取URL的响应    
  41.           InputStream is = con.getInputStream();  
  42.           int ch;  
  43.           StringBuffer b = new StringBuffer();  
  44.           while ((ch = is.read()) != -1) {  
  45.               b.append((char) ch);  
  46.           }  
  47.           String s = b.toString();  
  48.           if (s.contains("successfully")) {  
  49.               // for (int i = 1; i < 5; i++) {  
  50.               int beginIndex = s.indexOf("url =") + 5;  
  51.               int endIndex = s.indexOf("/n", beginIndex);  
  52.               String urlStr = s.substring(beginIndex, endIndex).trim();  
  53.               System.out.println(urlStr);  
  54.               // }  
  55.           }  
  56.           ds.close();  
  57.       } catch (Exception e) {  
  58.       }  
  59.   }  

相关文章
|
JavaScript 前端开发 API
一看就懂的gulp操作指南:让前端工作变得更加轻松(三)
一看就懂的gulp操作指南:让前端工作变得更加轻松
|
XML JSON Java
springboot文件上传,单文件上传和多文件上传,以及数据遍历和回显
本文介绍了在Spring Boot中如何实现文件上传,包括单文件和多文件上传的实现,文件上传的表单页面创建,接收上传文件的Controller层代码编写,以及上传成功后如何在页面上遍历并显示上传的文件。同时,还涉及了`MultipartFile`类的使用和`@RequestPart`注解,以及在`application.properties`中配置文件上传的相关参数。
springboot文件上传,单文件上传和多文件上传,以及数据遍历和回显
|
Java Spring
NoClassDefFoundError: com/fasterxml/jackson/annotation/JsonMerge【已解决】
NoClassDefFoundError: com/fasterxml/jackson/annotation/JsonMerge【已解决】
247 0
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。
397 1
|
前端开发 Java UED
已解决错误代码: MethodArgumentTypeMismatchException(方法参数类型不匹配异常)
已解决错误代码: MethodArgumentTypeMismatchException(方法参数类型不匹配异常)
vuepress打包报错【已解决】
vuepress打包报错【已解决】
359 4
|
XML 前端开发 数据格式
selenium--Xpath定位
selenium--Xpath定位
|
JavaScript Linux iOS开发
【Mac系统】Vscode使用LeetCode插件报错‘leetcode.toggleLeetCodeCn‘ not found
在Mac系统下使用VSCode的LeetCode插件时遇到“leetcode.toggleleetcodecn”命令找不到的错误解决方法,主要是通过从Nodejs官网下载并安装最新版本的Node.js来解决环境配置问题。
665 0
|
JavaScript 前端开发
CMD和UMD,ES Module的差别
CMD和UMD,ES Module的差别
|
Web App开发 缓存 前端开发
《手把手教你》系列技巧篇(四十四)-java+ selenium自动化测试-处理https 安全问题或者非信任站点-下篇(详解教程)
【5月更文挑战第8天】这篇文档介绍了如何在IE、Chrome和Firefox浏览器中处理不信任证书的问题。作者北京-宏哥分享了如何通过编程方式跳过浏览器的证书警告,直接访问不受信任的HTTPS网站。文章分为几个部分,首先简要介绍了问题背景,然后详细讲解了在Chrome浏览器中的两种方法,包括代码设计和运行效果,并给出了其他浏览器的相关信息和参考资料。最后,作者总结了处理此类问题的一些通用技巧。
405 2