从普通Web页面上传文件很简单,只需要在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 url 上传文件_Java使用HttpURLConnection上传文件(转)相关推荐

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

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

  2. java sftp 上传文件_java使用SFTP上传文件到资源服务器

    本文实例为大家分享了java实现SFTP上传文件到资源服务器工具类,供大家参考,具体内容如下 首先得创建连接sftp服务器的公共类MySftp.java: package cn.test.util; ...

  3. java form 上传文件_java通过表单进行文件上传的几种方法

    上传文件的分类: 无论什么方式上传文件,都要用post提交 方式一: 前端:表单方式上传文件 后端: 使用上传技术是apache中的Commons-fileupload.jar commons-io. ...

  4. java sftp上传文件_Java通过sftp上传文件

    Linux操作系统我们经常使用ssh中的ftp,sftp连接服务器,做相应操作. 如何通过java代码的形式采用sftp连接到服务器,进行文件上传下载等操作呢? 第一步,引入依赖包 com.jcraf ...

  5. java线上问题定位_java定位线上问题

    3.jstack: Java 提供的命令.可以查看某个进程的当前线程栈运行情况.根据 这个命令的输出可以定位某个进程的所有线程的当前运行状态.运行代码,以及 是否死锁等等...... A.//int ...

  6. java 生成操作excel文件_Java生成和操作Excel文件

    AVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该API非Windows操作系统也可以通过纯 ...

  7. java filewriter写入文件_Java中的写入字符文件类FileWriter

    上一章中我们介绍字符读取文件的类FileReader,这一章我们介绍 FileWriter主要是以字符的方式写入文件中的类. import java.io.File; import java.io.F ...

  8. java缓冲流 复制文件_java使用缓冲流复制文件的方法

    本文实例为大家分享了java使用缓冲流复制文件的具体代码,供大家参考,具体内容如下 [1] 程序设计 /*------------------------------- 1.缓冲流是一种处理流,用来加 ...

  9. java追加txt文件_java怎么追加写入txt文件

    java中,对文件进行追加内容操作的三种方法! import java.io.BufferedWriter;import java.io.FileOutputStream;import java.io ...

最新文章

  1. 稀疏性如何为AI推理增加难度
  2. 通过案例学功能 自定义监控功能初探
  3. Hinton:硕士毕业就进企业提不出全新想法,AI好坏取决于社会制度
  4. c/c++中运行外部程序
  5. 使用mint-ui开发项目的一些所得
  6. 读书笔记-《大话数据结构》第二章算法
  7. j2ee servlet 和 threadlocal ,synchronized 与 web容器
  8. android域账号认证失败,绕过域账户认证失败锁定次数限制的技巧
  9. Java LinkedList addFirst()方法与示例
  10. 为什么软件测试容易被小看,做软件测试容易忽视的问题
  11. form表单、控制器中接收表单提交数据的4种方式
  12. nginx模块nginx_upstream_check_module来检查后端服务器的健康情况
  13. 远程服务器学习总结篇1:ssh
  14. C++常用的大小写转换的方法
  15. python3下的webpy运行详解——webpy,session,cookie
  16. JS不跨域操控网易云音乐外链播放器
  17. Google Chorme
  18. html53列多行表格样式,教程(53):表格之美--了解布局菜单!
  19. 深入分析Android中Activity的onStop和onDestroy()回调延时及延时10s的问题
  20. 在Photoshop中绘制变形金刚

热门文章

  1. 一网打尽,最全面的跨域解决方案来了!
  2. Android Hander机制的理解
  3. 【LeetCode每周算法】零钱兑换
  4. python判断ip地址是否合法_python实现判断一个字符串是否是合法IP地址的示例
  5. IDEA整合 ssm的详细demo(使用maven)
  6. C++文件流:myfstream,fstream,文件读写,随机文件读写【C++文件流】(59)
  7. 笔记 - AliCloud CDN 分发网络简介
  8. python读取hdf文件 高效_利用python读取MODIS hdf文件
  9. excel报表服务器作用,Excel各种图表的应用范围及用途介绍
  10. mysql 创建job_MySQL 索引创建