代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
Java
】
用HttpURLConnection提交文件
作者:
netCode
/ 发布于
2016/6/20
/
743
用HttpURLConnection提交文件,无任何依赖,链式构造参数;
import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.UUID; public class HttpMultipart { public static void main(String[] args) throws Exception { String link = "http://www.xxx.com/upload"; HttpMultipart hm = new HttpMultipart(link).addParameter("file", new File("d:\\xxx.doc")).addParameter("other","somevalue"); String result = new String(hm.send()); hm.clearParameter(); System.out.println(result); } private URL url;// 链接URL private String boundary = "--------" + UUID.randomUUID().toString().replace("-", "");// HTTP报文分隔符 private Map<String, List<String>> textParams = new HashMap<String, List<String>>();// 字符串表单存储结构 private Map<String, List<File>> fileParams = new HashMap<String, List<File>>();// 文件表单存储结构 public HttpMultipart(String url) throws Exception { this.url = new URL(url); } protected Map<String, List<File>> getFileParams() { return fileParams; } protected Map<String, List<String>> getTextParams() { return textParams; } // 增加一个普通字符串数据到form表单数据中 public HttpMultipart addParameter(String name, String value) { List<String> list = textParams.get(name); if (list == null) { list = new LinkedList<String>(); list.add(value); textParams.put(name, list); } else { list.add(value); } return this; } // 增加一个文件到form表单数据中 public HttpMultipart addParameter(String name, File value) { List<File> list = fileParams.get(name); if (list == null) { list = new LinkedList<File>(); list.add(value); fileParams.put(name, list); } else { list.add(value); } return this; } // 删除指定的字符串参数 public HttpMultipart removeTextParameter(String name) { textParams.remove(name); return this; } // 删除指定的字符串参数(如果是数组,指定数组下标) public HttpMultipart removeTextParameter(String name, int index) { List<String> list = textParams.get(name); if (list != null) { if (list.size() > index) { list.remove(index); } if (list.size() == 0) { textParams.remove(name); } } return this; } // 删除指定的文件参数 public HttpMultipart removeFileParameter(String name) { fileParams.remove(name); return this; } // 删除指定的文件参数(如果是数组,指定数组下标) public HttpMultipart removeFileParameter(String name, int index) { List<File> list = fileParams.get(name); if (list != null) { if (list.size() > index) { list.remove(index); } if (list.size() == 0) { fileParams.remove(name); } } return this; } // 清除字符串参数 public HttpMultipart clearTextParameter() { textParams.clear(); return this; } // 清除文件参数 public HttpMultipart clearFileParameter() { fileParams.clear(); return this; } // 清除所有参数 public HttpMultipart clearParameter() { textParams.clear(); fileParams.clear(); return this; } // 发送数据到服务器,返回一个字节包含服务器的返回结果的数组 public byte[] send() throws Exception { HttpURLConnection connection = (HttpURLConnection) url.openConnection(); long length = getLength(); connection.setDoOutput(true); connection.setUseCaches(false); connection.setConnectTimeout(10000); // 连接超时为10秒 connection.setRequestMethod("POST"); connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); connection.setRequestProperty("Content-Length", length + ""); // connection.setFixedLengthStreamingMode((int) length);//设置上传流大小,防止OutOfMemoryError;但是Int的最大值只支持2G,所以暂时不用; connection.setChunkedStreamingMode(65536);// 设置上传流区块大小,防止OutOfMemoryError connection.connect(); OutputStream o = connection.getOutputStream(); writeFileParams(o); writeTextParams(o); paramsEnd(o); InputStream in = connection.getInputStream(); ByteArrayOutputStream out = new ByteArrayOutputStream(); transfer(in, out, 1024); out.close(); in.close(); connection.disconnect(); return out.toByteArray(); } // 获取一个字符串表单的长度 private long getParamLength(String name, String value) throws Exception { return 49 + boundary.length() + name.length() + value.getBytes().length; } // 获取一个文件表单的长度 private long getParamLength(String name, File value) throws Exception { return 102 + boundary.length() + name.length() + value.getName().getBytes().length + value.length(); } // 获取报文的长度 private long getLength() throws Exception { long length = 0; for (String name : textParams.keySet()) { List<String> list = textParams.get(name); for (String value : list) { length = length + getParamLength(name, value); } } for (String name : fileParams.keySet()) { List<File> list = fileParams.get(name); for (File value : list) { length = length + getParamLength(name, value); } } length = length + boundary.length() + 8; return length; } // 普通字符串数据 private void writeTextParams(OutputStream o) throws Exception { for (String name : textParams.keySet()) { List<String> list = textParams.get(name); for (String value : list) { o.write(new StringBuffer().append("--").append(boundary).append("\r\nContent-Disposition: form-data; name=\"").append(name).append("\"\r\n\r\n").append(value).append("\r\n").toString() .getBytes()); } } } // 文件数据 private void writeFileParams(OutputStream o) throws Exception { for (String name : fileParams.keySet()) { List<File> list = fileParams.get(name); for (File value : list) { o.write(new StringBuffer().append("--").append(boundary).append("\r\nContent-Disposition: form-data; name=\"").append(name).append("\"; filename=\"").append(value.getName()) .append("\"\r\nContent-Type: application/octet-stream\r\n\r\n").toString().getBytes()); writeFile(value, o); o.write("\r\n".getBytes()); } } } // 输出文件 private void writeFile(File f, OutputStream o) throws Exception { InputStream in = new FileInputStream(f); transfer(in, o); in.close(); } // 添加结尾数据 private void paramsEnd(OutputStream o) throws Exception { o.write(new StringBuffer().append("--").append(boundary).append("--\r\n\r\n").toString().getBytes()); } // 数据传输 public static void transfer(InputStream in, OutputStream out) throws Exception { transfer(in, out, 65536); } // 数据传输,指定缓冲区大小 public static void transfer(InputStream in, OutputStream out, int bufSize) throws Exception { byte[] b = new byte[bufSize]; int n; while ((n = in.read(b)) != -1) { out.write(b, 0, n); } b = null; } }
试试其它关键字
HttpURLConnection
同语言下
.
List 切割成几份 工具类
.
一行一行读取txt的内容
.
Java PDF转换成图片并输出给前台展示
.
java 多线程框架
.
double类型如果小数点后为零则显示整数否则保留两位小
.
将图片转换为Base64字符串公共类抽取
.
sqlParser 处理SQL(增删改查) 替换schema 用于多租户
.
JAVA 月份中的第几周处理 1-7属于第一周 依次类推 29-
.
java计算两个经纬度之间的距离
.
输入时间参数计算年龄
可能有用的
.
C#实现的html内容截取
.
List 切割成几份 工具类
.
SQL查询 多列合并成一行用逗号隔开
.
一行一行读取txt的内容
.
C#动态修改文件夹名称(FSO实现,不移动文件)
.
c# 移动文件或文件夹
.
c#图片添加水印
.
Java PDF转换成图片并输出给前台展示
.
网站后台修改图片尺寸代码
.
处理大图片在缩略图时的展示
netCode
贡献的其它代码
(
31
)
.
前端PC-移动端CSS公共样式+HTML
.
流星划过天空
.
实现点击按钮,弹出新窗口
.
map根据value排序
.
查看分区信息
.
#通过Hive导出到本地文件系统
.
2个iframe中checkbox联动
.
据刚刚插入数据的 ID 向另外一张表插入数据
.
用HttpURLConnection提交文件
.
复制专题地址和 url 地址,传给 QQ/MSN 上的好友
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3