从普通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上传文件相关推荐

  1. java http 下载文件_JAVA通过HttpURLConnection 上传和下载文件的方法

    本文介绍了JAVA通过HttpURLConnection 上传和下载文件的方法,分享给大家,具体如下: HttpURLConnection文件上传 HttpURLConnection采用模拟浏览器上传 ...

  2. java 图片上传_java web图片上传和文件上传实例

    本篇文章主要介绍了java web图片上传和文件上传实例,具有一定的参考价值,有需要的可以了解一下. 图片上传和文件上传本质上是一样的,图片本身也是文件.文件上传就是将图片上传到服务器,方式虽然有很多 ...

  3. java opencv 读取视频_java使用OpenCV从视频文件中获取帧

    本文实例为大家分享了java使用OpenCV从视频文件中获取帧的具体代码,供大家参考,具体内容如下 实现功能:使用Java获取mp4.mov.avi等视频文件中的图像帧,每秒获取一帧图像,并保存 环境 ...

  4. java url 上传文件_Java使用HttpURLConnection上传文件(转)

    从普通Web页面上传文件很简单,只需要在form标签叫上enctype="multipart/form-data"即可,剩余工作便都交给浏览器去完成数据收集并发送Http请求.但是 ...

  5. java spring mvc 上传_Java Spring MVC 上传下载文件配置及controller方法详解

    下载: 1.在spring-mvc中配置(用于100M以下的文件下载) 下载文件代码 @RequestMapping("/file/{name.rp}") public Respo ...

  6. JAVA 实现FTP功能_Java实现FTP上传下载功能

    public classFtp {private static final Logger logger = Logger.getLogger(FTP.class);/*** FTP客户端*/ priv ...

  7. java图片预览上传_Java实现图片上传预览 (使用ajax提交)

    html: 图片上传: js: function changepic(){ var reads = new FileReader(); f = document.getElementById('fil ...

  8. html5 java 图片上传_java实现图片上传至服务器并显示,如何做?希望要具体的代码实现...

    展开全部 有两种方法一是用上传的组建jspSmartUpload的Request, 还有一种不用组建,但在e69da5e6ba9062616964757a686964616f3133323865323 ...

  9. java 单文件上传_java – JIRA中的单个文件上传

    这是一个迟到的答案,但这是我在调查一天后发现的-- 如果您的< input type ="file">在JIRA对话框中,然后使用ajax提交表单.这就是请求的内容类型 ...

最新文章

  1. 编码中统一更该变量的快捷键_流媒体的7种方式使您成为更好的编码器
  2. pytorch .item_pytorch + SGD
  3. R语言ggplot2可视化:在可视化结果图的四个角落(左上、左下、右上、右下)添加标签实战
  4. 交管123缴费显示代理服务器异常,交管12123服务异常怎样办 交管12123 APP服务异常处理办法...
  5. Jupyter Notebook 代码自动补全功能
  6. Java谓词的延迟执行
  7. java中的time_java中的Time处理
  8. 【OpenCV入门指南】第十一篇 鼠标绘图
  9. c#进销存(1):需求分析
  10. 基于Java、Jsp实现购物车的功能
  11. java:从淘宝获取优惠券的、带推广链接的、带淘口令的商品信息
  12. 使用激光可调湿蚀刻曲面实现无间隙微透镜阵列的通用
  13. 【C语言】||(或) (且)
  14. python之动态性
  15. 语音识别原理与应用学习笔记
  16. 百度排名与谷歌排名规则
  17. idea中Project JDK is not defind的其中之一解决办法
  18. 只有那些疯狂到以为自己能够改变世界的人, 才能真正的改变世界
  19. 我在京东做研发第五期:京东云自研服务器,如何将开发成本降低 60% 的同时还更低碳环保?
  20. Facebook 新品 Lexical, 比 Quill 更好用的 Editor ?

热门文章

  1. 初识WebSocket
  2. loadrunner 录制 odbc 迭代出现lrd_db_option: ERROR, return-code=LRDE2009错误
  3. 黄金——家家都应藏有的投资品(转载自新浪)
  4. 多看看把,条件太多了--leetcode 93. 复原 IP 地址
  5. STL sort()函数详解
  6. 计算机科学与技术在线阅读,TL2011计算机科学与技术.pdf
  7. docker php伪静态无效,docker 安装 thinkphp+nginx
  8. Oracle 序列和触发器
  9. 052_CSS3 appearance属性
  10. php curl ob start,curl - php中开启缓冲压缩 ob_start('ob_gzhandler') 之后是在什么时候开始的压缩?...