- 浏览: 212196 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (107)
- java网络通信(rmi,hessian,nio...) (4)
- java基础 (25)
- java压缩和解压缩 (1)
- 开发框架整合 (7)
- struts2.0 (3)
- 构建工具(ant,maven..) (1)
- web容器配置(tomcat,weblogic,nginx...) (3)
- hibernate (8)
- 业务(项目管理,项目设计相关) (5)
- 数据库(oracle,mysql..) (7)
- linux命令 (6)
- java网络通信(rmi (6)
- hessian (6)
- nio...) (6)
- 数据库(oracle (4)
- mysql..) (4)
- ibatis (2)
- 多线程 (1)
- Windows Install Clean Up 卸载JDK (1)
- IETEST (1)
- UML 类图 关系 (1)
- java基础 spring (2)
- NFS SFU (1)
- jmap mat jps (1)
- 架构 (1)
- 统一管理 (0)
- 项目管理 (1)
- 图片预加载 (1)
- 代码高亮 (1)
- 同步 (1)
- 权限管理 (0)
- ehcache ibatis (1)
- jd-gui proguard (1)
- portmon (1)
- procexp (1)
- mysql (1)
- NIO 内存映射文件 (1)
- web容器配置(tomcat (1)
- weblogic (1)
- nginx...) (1)
- WEB (1)
- html (1)
- javascript (1)
- iOS pods (1)
最新评论
-
vrbvillor:
我的QQ是245614005。如果您可以帮我的话,请发邮件或联 ...
mysql存储过程中使用动态SQL,并且返回值 -
vrbvillor:
大侠,请教一个问题。我想在mysql的function里边 ...
mysql存储过程中使用动态SQL,并且返回值 -
newslxw:
ppgunjack 写道关键要弄清楚,UAT用例是谁提供,谁评 ...
做到客户满意为止(项目成本控制相关主题) -
萧十一狼:
所有dao类都继承com.ibatis.sqlmap.clie ...
spring+ibatis整合方法 -
adss101:
一般项目就这块比较难控制,,弄不好就死在这了,,客户要求,对于 ...
做到客户满意为止(项目成本控制相关主题)
首先,实现自动上传文件方式有很多种,其中就有 SOCKET , RMI , HTTP 等,考虑到服务器本身是个网站服务器,使用 SOCKET 和 RMI 需要单独开发端口, HTTP 则可以直接融合到网站中,也没有特殊的要求,所以采用了 HTTP 方式。 HTTP 方式又有好几种,其中就有 hessian 和 HttpUrlConnection 。使用 hessian 的话, hessian 提供的流上传有缺陷,可能会导致内存溢出,因此只能是将文件以多个字节数组方式传输到服务器,然后程序再整合字节成完整文件,无疑增加了代码复杂度。所以最终选择了 HttpUrlConnection 。
通过 HttpUrlConnection 自动上传文件,服务端和用户通过网页上传文件到服务器的程序一模一样,只是客户端,我们用 HttpUrlConnection 来代替浏览器向服务器提交数据。因此我们首先要弄清楚浏览器发送数据的格式。
第1步,数据格式:
发送文件, method 是 POST ; multipart/form-data ;我们通过 firefox 的 firebug 查看具体上传
下面数据是 iteye 上上传一个空文件是的 firebug 提交的数据。
文件格式如下:
head
Content-Length 357 Content-Type multipart/form-data; boundary=---------------------------41184676334
body
-----------------------------41184676334 Content-Disposition: form-data; name="authenticity_token" vggMNy0klrhNiSh9bQkSYeN/c3tx11I/lS0T7YDpc9U= -----------------------------41184676334 Content-Disposition: form-data; name="attachment[uploaded_data]"; filename="test.zip" Content-Type: application/zip -----------------------------41184676334—
格式解析:
Content-Length 定义了发送数据的总字节数;
Content-Type 定义格式和数据分界符 boundary ,下面发送的数据将用这个 boundary 分隔每一个变量, boundary 中的 41184676334 是由浏览器随机生成,我们可以直接使用 。
发送 2 个变量,分别是 authenticity_token 和空文件 test.zip
变量开头是 “--”+boundary ,然后下一行 Content-Disposition 定义变量名称,下一行是 content-type 定义数据格式,这个不是必须的,发送文件数据时, content-type 需要指定,
这里指出了文件类型,我们可以用 application/octet-stream 告诉服务器发送的是流,再空两行(即 \r\n\r\n ),是变量的值或者文件的内容。然后下一行开始是另外一个变量。最后一个变量以 “—“+boundary+”—“ 结束。
第2步 HTTPS 处理
有时候网站采用的是 HTTPS 协议,因此我们需要相应的证书,我们考虑是让程序接受所有证书,就像浏览器上设置接受所有证书,不管签名与否。实际是我们也无需证书,服务器也是我们自己的,我当然相信自己编写的客户端当然也相信自己的服务端了。
要接受所有服务器上的证书,我们需要实现两个接口
javax.net.ssl.X509TrustManager 和 javax.net.ssl.HostnameVerifier
接口中的函数都以空函数覆盖即可。其中 javax.net.ssl.HostnameVerifier 的 verify 返回 true 即可。下面是我们连接服务器的函数
HttpURLConnection getHttpConnection(String urlString) throws Exception { URL url = new URL(urlString); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); if ("https".equalsIgnoreCase(url.getProtocol())) { HttpsURLConnection httpsConn=(HttpsURLConnection) conn; TrustManager[] managers ={new MyX509TrustManager()}; SSLContext sslContext=SSLContext.getInstance("TLS"); sslContext.init(null, managers, new SecureRandom()); SSLSocketFactory ssf=sslContext.getSocketFactory(); httpsConn.setSSLSocketFactory(ssf); httpsConn.setHostnameVerifier(new MyHostnameVerifier()); return httpsConn; } else { return conn; } }
其中 MyX509TrustManager 和 MyHostnameVerifier 分别是
javax.net.ssl.X509TrustManager 和 javax.net.ssl.HostnameVerifier 的实现类。
第 3 步,发送数据
连接了服务器,就可以发送数据了。
首先定义连接的
header
和连接方式和
boundary
conn = getHttpConnection(urlString); conn.setDoOutput(true); conn.setDoInput(true); conn.setRequestMethod("POST"); String BOUNDARY = "---------------------------41184676334"; conn.setRequestProperty("connection", "Keep-Alive"); conn.setRequestProperty("Charsert", "UTF-8"); conn.setRequestProperty("user-agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0"); //可以不指定 conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY); conn.setRequestProperty("Content-Length", String.valueOf(contentLen)); //不清楚长度,可以不写 conn.setAllowUserInteraction(false); //无需用户交互,即弹出https等的对话框。 conn.setChunkedStreamingMode(blockSize); //告诉HttpUrlConnection,我们需要采用流方式上传数据,无需本地缓存数据。HttpUrlConnection默认是将所有数据读到本地缓存,然后再发送给服务器,这样上传大文件时就会导致内存溢出。 byte[] end_data = ("\r\n--" + BOUNDARY + "--\r\n").getBytes(); StringBuffer sb = new StringBuffer(); sb.append("--").append(BOUNDARY).append("\r\n"); sb.append("Content-Disposition: form-data; name=\"username\"\r\n\r\n"); sb.append(username); sb.append("\r\n--").append(BOUNDARY).append("\r\n"); sb.append("--").append(BOUNDARY).append("\r\n"); sb.append("Content-Disposition: form-data; name=\"password\"\r\n\r\n"); sb.append(password); sb.append("\r\n--").append(BOUNDARY).append("\r\n"); sb.append("--").append(BOUNDARY).append("\r\n"); sb.append("Content-Disposition: form-data; name=\"file\"; filename=\identify.zip\"\r\n"); sb.append("Content-Type: application/octet-stream\r\n\r\n"); byte[] data = sb.toString().getBytes(); long fLen = f.length(); long contentLen = data.length + fLen + end_data.length; os.write(data); //发送非文件数据 fis = new FileInputStream(f); //读取文件内容,发送数据,数据要一点点发送,不能一下全部读取发送,否则会内存溢出。 int rn; byte[] buf = new byte[blockSize]; while ((rn = fis.read(buf, 0, blockSize)) > 0) { os.write(buf, 0, rn); } os.write(end_data); os.flush(); os.close(); fis.close();
第 4 步,接受服务器处理结果
ByteArrayOutputStream bo = new ByteArrayOutputStream(); InputStream is = conn.getInputStream(); byte[] inbuf = new byte[blockSize/10]; while ((rn = is.read(inbuf, 0, blockSize/10)) > 0) { bo.write(inbuf); } is.close(); String ret = bo.toString(); bo.close();
发表评论
-
MappedByteBuffer小结
2012-07-28 17:27 1591java的内存映射文件有如下特点: 1,使用虚拟内存, ... -
jstat 详解
2012-07-28 12:56 922jstat 详解 jstat ... -
NIO的内存映射文件一些问题
2012-07-28 12:51 1192见 http://yipsilon.iteye.com/bl ... -
Permanent会被GC
2012-04-23 17:27 816http://fallenlord.blogbus.c ... -
JVM内存分析工具
2011-11-28 17:17 1239参考 jvm内存分解: ... -
JVM内存解析
2011-11-28 17:10 863参考: http://vanadiumlin.iteye.c ... -
基本类型的初始化值
2011-11-28 11:05 990各基本类型在没初始化时,默认如下值 boolean init ... -
多线程笔记
2011-11-28 10:47 8391、synchronized以线程为单位,不是以调用为单位,通 ... -
B/S系统打印
2011-11-10 17:00 1311B/S系统打印都很费劲,到目前我还没找到一个完善的方法,以下是 ... -
在文件中间插入数据
2011-11-10 15:55 1041目前没有什么好方法能直接在文件中间插入数据. 都是采用先将插 ... -
将JAR打包成EXE,并且生成安装文件
2011-11-10 15:21 2619桌面程序项目完成后,需要将项目打包成安装包在WINDOWS下运 ... -
卸载JDK导致applet不能显示
2011-11-09 17:59 867最近做测试,需要卸载JDK,卸载后发现JAVA UPDATE不 ... -
多线程下谨慎对待基类(抽象类)中的成员变量
2011-07-06 22:13 2374有这么个需求: 做开发 ... -
wait和notify使用方法
2011-07-05 13:47 1204原则是: 调用wait的对象必须是synchronized中的 ... -
SimpleDateFormat在多线程下不安全
2011-07-05 13:42 2081在工具类中有2个时间格式化和字符串转换成时间的函数,使用了类静 ... -
java计算两个日期间隔方法
2011-06-24 16:55 2789SimpleDateFormat formatter = ... -
jtable选中指定的行和选中事件监听
2011-06-16 18:49 11313选中行 table.getSelectionModel().s ... -
监听jtable单元格内容改变事件
2011-06-16 18:45 7560对话框监听jtable内容是否改变,改变后,在用户退出时提示是 ... -
自定义jtable单元格显示方式
2011-06-16 18:41 1560自定义jtable显示方式,需要继承DefaultTableC ... -
自定义jtable单元格编辑器
2011-06-16 18:35 3602jtable每行每列的单元格的编辑器都可以自定义, 方法如下: ...
相关推荐
在本文中,我们将深入探讨如何使用HttpURLConnection实现文件上传,同时也会涉及普通参数的传递。 首先,我们需要理解HTTP请求的基本结构。HTTP请求通常由以下几个部分组成:请求行、请求头、空行和请求体。在文件...
通过这些Java技术,你可以构建一个本地文件系统与远程服务器之间的实时同步系统,从而满足文件自动上传的需求。这只是一个基础实现,根据具体业务场景,你可能需要对代码进行适当的调整和扩展。
使用 Java 语言实现上传网络图片到微信临时素材需要考虑多方面的因素,包括获取 access_token、边界设置、文件流输出和异常处理等。通过本文,我们可以了解到微信临时素材的概念和实现上传网络图片到微信临时素材的...
在Java编程环境中,实现文件的自动上传是一项常见的任务,尤其在Web应用或者云服务集成中。这个场景下,我们通常需要编写一个Java程序,能够自动地将本地文件上传到服务器或者特定的存储服务。以下是对这个主题的...
下面将详细介绍如何使用Java实现文件上传功能。 1. **HTTP协议与文件上传** 文件上传通常基于HTTP或HTTPS协议,尤其是HTTP的POST方法。POST请求允许客户端向服务器发送数据,包括文件内容。在Java中,可以使用`...
本话题主要涉及的是如何使用Java编程语言来实现一个监控Windows文件夹并自动上传文件到HTTP服务器的程序。以下是对这个主题的详细说明: 首先,我们要了解Java在文件监控方面的功能。Java中的`java.nio.file`包提供...
在Java中,通过`HttpURLConnection`类可以轻松地实现POST请求,用于发送和接收文件流。该方法主要涉及到以下几个步骤: - **创建URL对象**:首先需要根据指定的URL地址创建一个`URL`对象。 - **设置HTTP连接属性**...
Android端的实现涉及到使用HttpURLConnection或Retrofit等网络库来发送POST请求,携带文件数据。关键步骤包括: - 文件读取:使用`openFileInput()`或`getAssets().open()`读取本地文件。 - 创建RequestBody:...
总的来说,Java实现文件上传下载工具涉及网络编程、I/O流、字符编码等多个方面,开发者需要理解各种协议的工作原理,并合理选择和使用合适的库来简化开发过程。对于复杂的项目,可能还需要考虑到性能优化、安全性...
本文将深入探讨“Netroid框架”和“HttpURLConnection类”的使用,并通过一个文件下载的示例来阐述如何利用它们进行文件传输,同时关注性能指标如下载速度。 **Netroid框架** Netroid是一个轻量级的Android网络...
这个压缩包"安卓文件下载上传解压相关-Android实现应用下载后自动安装源码.zip"提供了关于如何在Android上实现应用自动下载并安装的示例代码。下面将详细探讨这些知识点。 1. 文件下载: 在Android中,可以使用...
在Java中,文件上传可以通过HTTP协议实现,常见的库有Apache HttpClient或者使用Java内置的HttpURLConnection。文件上传通常涉及以下步骤: 1. **构建HTTP请求**:创建POST请求,设置请求头,比如Content-Type...
在本压缩包“基于Java的实例源码-文件上传组件 COS.zip”中,包含的是一个使用Java语言开发的文件上传组件,它与腾讯云对象存储服务(COS,Cloud Object Storage)进行了集成。这个组件使得开发者能够方便地将本地...
这里,我们主要关注的是如何在Android应用程序中实现文件上传到服务器的功能。这个场景通常涉及到网络编程和HTTP请求,特别是POST请求,因为大多数文件上传是通过HTTP的POST方法来完成的。 首先,我们看到有一个名...
2. **HTTP协议**:利用Java的`java.net.HttpURLConnection`或第三方库如Apache HttpClient,可以实现基于HTTP的文件上传和下载。HTTP协议提供了丰富的头部信息,可以控制文件传输的断点续传、缓存等特性,且广泛被...
在本例中,我们可能会使用HttpURLConnection或者现代的Retrofit库来完成文件上传,因为它们更高效且易于使用。 1. **HttpURLConnection**:这是Java标准库的一部分,适用于简单的HTTP操作。通过建立连接,设置请求...
接下来,可以使用Java的HttpURLConnection或HttpClient库,向每个图片URL发送GET请求,获取响应的二进制数据,这就是图片的原始字节流。 为了将这些图片保存到本地,Spring Boot可以提供文件系统存储或云存储的支持...
用于模拟浏览器访问网页,抓取站点源文件。... * version 1.0.0_00,支持POST数据,支持SSL,支持上传文件。 * GET、POST方式无需设置自动判断。 * 代码经过优化和修理。 【API简介】