java http 上传_Java使用HttpURLConnection上传文件
从普通Web页面上传文件非常easy。仅仅须要在form标签叫上enctype="multipart/form-data"就可以,剩余工作便都交给浏览器去完毕数据收集并发送Http请求。可是假设没有页面的话要怎么上传文件呢?
因为脱离了浏览器的环境,我们就要自己去完毕数据的收集并发送请求。所以就非常麻烦了。首先我们来写个JSP页面并看看浏览器发出的Http请求是什么样的
JSP页面:
TestSubmit
參数
文件1
文件2
假如我參数写的内容是hello word,然后二个文件是二个简单的txt文件。form提交的信息为:
-----------------------------7da2e536604c8
Content-Disposition: form-data; name="username"
hello word
-----------------------------7da2e536604c8
Content-Disposition: form-data; name="file1"; filename="D:/haha.txt"
Content-Type: text/plain
haha
hahaha
-----------------------------7da2e536604c8
Content-Disposition: form-data; name="file2"; filename="D:/huhu.txt"
Content-Type: text/plain
messi
huhu
-----------------------------7da2e536604c8--
研究下规律发现有例如以下几点特征:
1. 第一行是“-----------------------------7da2e536604c8”作为分隔符,然后是“/r/n”回车换行符。 这个7da2e536604c8分隔符浏览器是随机生成的。
2. 第二行是Content-Disposition: form-data; name="username"。代表form表单的数据域,name相应页面input标签的name值。
3. 第三行是“/r/n”回车换行符。
4. 第四行是參数username的值。
5. 第五行是7da2e536604c8分隔符。
6. 从第六行到第十行和从第十二行到第十六行,各自是上传的两个文件的数据域。
7. 第十二行是Content-Disposition: form-data; name="file2"; filename="D:/huhu.txt"。name相应页面input标签的name值。filename相应要上传的文件名称(包含路径在内)。
8. 第十三行假设是文件就有Content-Type: text/plain。这里上传的是txt文件所以是text/plain。假设上穿的是jpg图片的话就是image/jpg了,能够自己试试看看。
然后就是回车换行符。
9. 第十五、十六行就是文件的内容了。如:
messi
huhu
10. 最后一行是-----------------------------7da2e536604c8--。注意最后多了二个“--”。作为结束的标志。
那么我们仅仅要模拟这个数据,并写入到Http请求中便能实现文件的上传。
事实上。在我之前的文章:HttpClient使用具体解释 ,就已经有利用HttpClient工具包上传文件的样例。HttpClient是Apache的一个强大的模拟并发送全部Http请求的开源类库,有时间的。大家能够学习学习,但本篇文章中。并不以HttpClient为例。而是採用Java自带的HttpURLConnection实现的。
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import net.sf.jmimemagic.Magic;
import net.sf.jmimemagic.MagicMatch;
public class HttpPostUploadUtil {
/**
* @param args
*/
public static void main(String[] args) {
String filepath = "E:\\ziliao\\0.jpg";
String urlStr = "http://127.0.0.1:8080/minicms/up/up_result.jsp";
Map textMap = new HashMap();
textMap.put("name", "testname");
Map fileMap = new HashMap();
fileMap.put("userfile", filepath);
String ret = formUpload(urlStr, textMap, fileMap);
System.out.println(ret);
}
/**
* 上传图片
* @param urlStr
* @param textMap
* @param fileMap
* @return
*/
public static String formUpload(String urlStr, Map textMap, Map fileMap) {
String res = "";
HttpURLConnection conn = null;
String BOUNDARY = "---------------------------123821742118716"; //boundary就是request头和上传文件内容的分隔符
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("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.6)");
conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
OutputStream out = new DataOutputStream(conn.getOutputStream());
// text
if (textMap != null) {
StringBuffer strBuf = new StringBuffer();
Iterator> iter = textMap.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = iter.next();
String inputName = (String) entry.getKey();
String inputValue = (String) entry.getValue();
if (inputValue == null) {
continue;
}
strBuf.append("\r\n").append("--").append(BOUNDARY).append("\r\n");
strBuf.append("Content-Disposition: form-data; name=\"" + inputName + "\"\r\n\r\n");
strBuf.append(inputValue);
}
out.write(strBuf.toString().getBytes());
}
// file
if (fileMap != null) {
Iterator> iter = fileMap.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = iter.next();
String inputName = (String) entry.getKey();
String inputValue = (String) entry.getValue();
if (inputValue == null) {
continue;
}
File file = new File(inputValue);
String filename = file.getName();
MagicMatch match = Magic.getMagicMatch(file, false, true);
String contentType = match.getMimeType();
StringBuffer strBuf = new StringBuffer();
strBuf.append("\r\n").append("--").append(BOUNDARY).append("\r\n");
strBuf.append("Content-Disposition: form-data; name=\"" + inputName + "\"; filename=\"" + filename + "\"\r\n");
strBuf.append("Content-Type:" + contentType + "\r\n\r\n");
out.write(strBuf.toString().getBytes());
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);
}
in.close();
}
}
byte[] endData = ("\r\n--" + 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;
}
}
在上述代码中,关于contentType的获取方式。我在上篇文章中已经讲述过了,有兴趣的能够看看。
java http 上传_Java使用HttpURLConnection上传文件相关推荐
- java http 下载文件_JAVA通过HttpURLConnection 上传和下载文件的方法
本文介绍了JAVA通过HttpURLConnection 上传和下载文件的方法,分享给大家,具体如下: HttpURLConnection文件上传 HttpURLConnection采用模拟浏览器上传 ...
- java 图片上传_java web图片上传和文件上传实例
本篇文章主要介绍了java web图片上传和文件上传实例,具有一定的参考价值,有需要的可以了解一下. 图片上传和文件上传本质上是一样的,图片本身也是文件.文件上传就是将图片上传到服务器,方式虽然有很多 ...
- java opencv 读取视频_java使用OpenCV从视频文件中获取帧
本文实例为大家分享了java使用OpenCV从视频文件中获取帧的具体代码,供大家参考,具体内容如下 实现功能:使用Java获取mp4.mov.avi等视频文件中的图像帧,每秒获取一帧图像,并保存 环境 ...
- java url 上传文件_Java使用HttpURLConnection上传文件(转)
从普通Web页面上传文件很简单,只需要在form标签叫上enctype="multipart/form-data"即可,剩余工作便都交给浏览器去完成数据收集并发送Http请求.但是 ...
- java spring mvc 上传_Java Spring MVC 上传下载文件配置及controller方法详解
下载: 1.在spring-mvc中配置(用于100M以下的文件下载) 下载文件代码 @RequestMapping("/file/{name.rp}") public Respo ...
- JAVA 实现FTP功能_Java实现FTP上传下载功能
public classFtp {private static final Logger logger = Logger.getLogger(FTP.class);/*** FTP客户端*/ priv ...
- java图片预览上传_Java实现图片上传预览 (使用ajax提交)
html: 图片上传: js: function changepic(){ var reads = new FileReader(); f = document.getElementById('fil ...
- html5 java 图片上传_java实现图片上传至服务器并显示,如何做?希望要具体的代码实现...
展开全部 有两种方法一是用上传的组建jspSmartUpload的Request, 还有一种不用组建,但在e69da5e6ba9062616964757a686964616f3133323865323 ...
- java 单文件上传_java – JIRA中的单个文件上传
这是一个迟到的答案,但这是我在调查一天后发现的-- 如果您的< input type ="file">在JIRA对话框中,然后使用ajax提交表单.这就是请求的内容类型 ...
最新文章
- 编码中统一更该变量的快捷键_流媒体的7种方式使您成为更好的编码器
- pytorch .item_pytorch + SGD
- R语言ggplot2可视化:在可视化结果图的四个角落(左上、左下、右上、右下)添加标签实战
- 交管123缴费显示代理服务器异常,交管12123服务异常怎样办 交管12123 APP服务异常处理办法...
- Jupyter Notebook 代码自动补全功能
- Java谓词的延迟执行
- java中的time_java中的Time处理
- 【OpenCV入门指南】第十一篇 鼠标绘图
- c#进销存(1):需求分析
- 基于Java、Jsp实现购物车的功能
- java:从淘宝获取优惠券的、带推广链接的、带淘口令的商品信息
- 使用激光可调湿蚀刻曲面实现无间隙微透镜阵列的通用
- 【C语言】||(或) (且)
- python之动态性
- 语音识别原理与应用学习笔记
- 百度排名与谷歌排名规则
- idea中Project JDK is not defind的其中之一解决办法
- 只有那些疯狂到以为自己能够改变世界的人, 才能真正的改变世界
- 我在京东做研发第五期:京东云自研服务器,如何将开发成本降低 60% 的同时还更低碳环保?
- Facebook 新品 Lexical, 比 Quill 更好用的 Editor ?
热门文章
- 初识WebSocket
- loadrunner 录制 odbc 迭代出现lrd_db_option: ERROR, return-code=LRDE2009错误
- 黄金——家家都应藏有的投资品(转载自新浪)
- 多看看把,条件太多了--leetcode 93. 复原 IP 地址
- STL sort()函数详解
- 计算机科学与技术在线阅读,TL2011计算机科学与技术.pdf
- docker php伪静态无效,docker 安装 thinkphp+nginx
- Oracle 序列和触发器
- 052_CSS3 appearance属性
- php curl ob start,curl - php中开启缓冲压缩 ob_start('ob_gzhandler') 之后是在什么时候开始的压缩?...