- 浏览: 68233 次
文章分类
最新评论
-
小色帝:
我是天才是打发
Jquery实现的Tabs页 -
小色帝:
小色帝 写道1111而温热
Jquery实现的Tabs页 -
小色帝:
1111而温热
Jquery实现的Tabs页
网络编程之使用HttpClient批量上传文件(一)
2014年10月09日 23:41:45
阅读数:14761
请尊重他人的劳动成果,转载请注明出处:Android网络编程之使用HttpClient批量上传文件
我曾在《Android网络编程之使用HTTP访问网络资源》一文中介绍过HttpCient的使用,这里就不在累述了,感兴趣的朋友可以去看一下。在这里主要介绍如何通过HttpClient实现文件上传。
1.预备知识:
在HttpCient4.3之前上传文件主要使用MultipartEntity这个类,但现在这个类已经不在推荐使用了。随之替代它的类是MultipartEntityBuilder。
下面让我们了解一下MultipartEntityBuilder类:
MultipartEntityBuilder这个类主要用于创建HttpEntity。它的主要方法有:
修饰符和类型
方法和描述
MultipartEntityBuilder
addBinaryBody(String name, byte[] b)
将字节数组以二进制的形式添加数据。
MultipartEntityBuilder
addBinaryBody(String name, byte[] b, ContentType contentType, String filename)
将字节数组以二进制的形式添加数据。
MultipartEntityBuilder
addBinaryBody(String name, File file)
将文件以二进制的形式添加数据。
MultipartEntityBuilder
addBinaryBody(String name, File file, ContentType contentType, String filename)
将文件以二进制的形式添加数据。
MultipartEntityBuilder
addBinaryBody(String name, InputStream stream)
MultipartEntityBuilder
addBinaryBody(String name, InputStream stream, ContentType contentType, String filename)
将输入流以二进制的形式添加数据。
MultipartEntityBuilder
addPart(String name, ContentBody contentBody)
添加ContentBody 类型的数据。
MultipartEntityBuilder
addTextBody(String name, String text)
添加文本数据。
MultipartEntityBuilder
addTextBody(String name, String text, ContentType contentType)
以指定的内容类型添加文本数据。
HttpEntity
build()
创建一个HttpEntity。
static MultipartEntityBuilder
create()
创建一个MultipartEntityBuilder对象。
MultipartEntityBuilder
setBoundary(String boundary)
设置边界。
MultipartEntityBuilder
setCharset(Charset charset)
设置请求的编码格式。
MultipartEntityBuilder
setLaxMode()
MultipartEntityBuilder
setMode(HttpMultipartMode mode)
设置模式。
MultipartEntityBuilder
setStrictMode()
主要方法说明:
addBinaryBody、addPart、addTextBody方法用于添加要上传的数据,从上面的表格中可以发现用于添加数据的方法,都是key-value类型。所以在服务器端我们可以通过request.getPart("keyname")方式获取对应key的数据。也可以通过request.getParts()方式获取客户端通过以上三种方法提交所有数据。
1.通过addBinaryBody方法直接可以添加File、InputStream、byte[]类型的数据。
2.通过addPart方法只能添加ContentBody类型的数据,在org.apache.http.entity.mime.content包中已经提供了String、File以及InputStream对应的ContentBody类型的子类,如FileBody、InputStreamBody、StringBody,通过这些类我们可以将String、File以及InputStream类型的数据转换成ContentBody类型的数据。
3.通过addTextBody方法我们可以很方便的添加文本数据。
2.通过HttpCient上传文件
Android端需要添加httpcore-4.3.2.jar、httpmime-4.3.5.jar两个包。两个包缺一不可。
在这里我用的是最新版的HttpCient,大家可以从http://hc.apache.org/downloads.cgi上下载所需要的jar包,如果上面的网站打不开,大家也不用担心,我已经将项目中所需要的jar包上传到CSDN上《httpcomponents-client-4.3.5-bin.zip》需要的朋友可以去下载。
Android端项目核心代码:
[java] view plain copy
HttpClient client=new DefaultHttpClient();// 开启一个客户端 HTTP 请求
HttpPost post = new HttpPost(url);//创建 HTTP POST 请求
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
// builder.setCharset(Charset.forName("uft-8"));//设置请求的编码格式
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);//设置浏览器兼容模式
int count=0;
for (File file:files) {
// FileBody fileBody = new FileBody(file);//把文件转换成流对象FileBody
// builder.addPart("file"+count, fileBody);
builder.addBinaryBody("file"+count, file);
count++;
}
builder.addTextBody("method", params.get("method"));//设置请求参数
builder.addTextBody("fileTypes", params.get("fileTypes"));//设置请求参数
HttpEntity entity = builder.build();// 生成 HTTP POST 实体
post.setEntity(entity);//设置请求参数
HttpResponse response = client.execute(post);// 发起请求 并返回请求的响应
if (response.getStatusLine().getStatusCode()==200) {
return true;
}
return false;
代码分析:
上面代码主要实现了多文件上传,为了方便服务器端保存文件,上面代码设置了名称为fileTypes的参数,fileTypes是由上传的文件类型名拼接成的字符串,如”.jpg.png.docx“;
服务器端可以通过获取名为fileTypes的参数,然后将其拆分成字符数组,即可得到要保存文件的类型。
服务器端项目核心代码:
服务器段主要用到Servlet3.0的API,主要用到的方法有:
1. request.getParameter("");//获取客户端通过addTextBody方法添加的String类型的数据。
2. request.getPart("");//获取客户端通过addBinaryBody、addPart、addTextBody方法添加的指定数据,返回Part类型的对象。
3. request.getParts();//获取客户端通过addBinaryBody、addPart、addTextBody方法添加的所有数据,返回Collection<Part>类型的对象。
4. part.getName();//获取上传文件的名称即上传时指定的key。
5. part.getSize()//获取上传文件的大小单位为字节。
[java] view plain copy
String fileTypes=request.getParameter("fileTypes");//获取客户端上传的所有文件类型
String[]typeArray=fileTypes.substring(1).split("\\.");//将文件类型字符串拆分成String数组
try {
Iterator<Part>iterator=request.getParts().iterator();
int count=0;
while (iterator.hasNext()) {//遍历客户端上传的所有文件
if (count>=typeArray.length)break;//如果超出文件类型数组的大小则跳出循环
Part part = (Part) iterator.next();
// System.out.println("part.getSize()"+part.getSize());//获取上传文件的大小
// System.out.println("part.getName()"+part.getName());//获取上传文件的名及添加数据时的key名
File file=new File("E:\\upload\\"+count+"."+typeArray[count++]);
InputStream inputStream=part.getInputStream();
FileOutputStream fos=new FileOutputStream(file);
byte[]buffer=new byte[1024];
int len=0;
while ((len=inputStream.read(buffer))!=-1) {
fos.write(buffer,0, len);
}
inputStream.close();
fos.close();
}
}catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
代码分析:
服务器端是通过Servlet实现的,通过调用request.getParameter("fileTypes")方法来获取客户端上传的所有文件类型,然后将文件类型字符串拆分成String数组。通过request.getParts()方法取出客户端通过addBinaryBody、addPart、addTextBody上传的所有数据,然后遍历数据集合即可进行文件的保存。
由于事先和客户端协定,添加上传文件的顺序在添加请求参数之前,所以可以根据拆分出的文件类型数组的长度判断出客户端上传文件的个数,因此当上面代码遍历超出了类型数组的长度时程序跳出循环,不再进行文件的保存,因为下面的Part都是些参数,而不是要保存的文件了
https://blog.csdn.net/demon_huirong/article/details/51878077
2014年10月09日 23:41:45
阅读数:14761
请尊重他人的劳动成果,转载请注明出处:Android网络编程之使用HttpClient批量上传文件
我曾在《Android网络编程之使用HTTP访问网络资源》一文中介绍过HttpCient的使用,这里就不在累述了,感兴趣的朋友可以去看一下。在这里主要介绍如何通过HttpClient实现文件上传。
1.预备知识:
在HttpCient4.3之前上传文件主要使用MultipartEntity这个类,但现在这个类已经不在推荐使用了。随之替代它的类是MultipartEntityBuilder。
下面让我们了解一下MultipartEntityBuilder类:
MultipartEntityBuilder这个类主要用于创建HttpEntity。它的主要方法有:
修饰符和类型
方法和描述
MultipartEntityBuilder
addBinaryBody(String name, byte[] b)
将字节数组以二进制的形式添加数据。
MultipartEntityBuilder
addBinaryBody(String name, byte[] b, ContentType contentType, String filename)
将字节数组以二进制的形式添加数据。
MultipartEntityBuilder
addBinaryBody(String name, File file)
将文件以二进制的形式添加数据。
MultipartEntityBuilder
addBinaryBody(String name, File file, ContentType contentType, String filename)
将文件以二进制的形式添加数据。
MultipartEntityBuilder
addBinaryBody(String name, InputStream stream)
MultipartEntityBuilder
addBinaryBody(String name, InputStream stream, ContentType contentType, String filename)
将输入流以二进制的形式添加数据。
MultipartEntityBuilder
addPart(String name, ContentBody contentBody)
添加ContentBody 类型的数据。
MultipartEntityBuilder
addTextBody(String name, String text)
添加文本数据。
MultipartEntityBuilder
addTextBody(String name, String text, ContentType contentType)
以指定的内容类型添加文本数据。
HttpEntity
build()
创建一个HttpEntity。
static MultipartEntityBuilder
create()
创建一个MultipartEntityBuilder对象。
MultipartEntityBuilder
setBoundary(String boundary)
设置边界。
MultipartEntityBuilder
setCharset(Charset charset)
设置请求的编码格式。
MultipartEntityBuilder
setLaxMode()
MultipartEntityBuilder
setMode(HttpMultipartMode mode)
设置模式。
MultipartEntityBuilder
setStrictMode()
主要方法说明:
addBinaryBody、addPart、addTextBody方法用于添加要上传的数据,从上面的表格中可以发现用于添加数据的方法,都是key-value类型。所以在服务器端我们可以通过request.getPart("keyname")方式获取对应key的数据。也可以通过request.getParts()方式获取客户端通过以上三种方法提交所有数据。
1.通过addBinaryBody方法直接可以添加File、InputStream、byte[]类型的数据。
2.通过addPart方法只能添加ContentBody类型的数据,在org.apache.http.entity.mime.content包中已经提供了String、File以及InputStream对应的ContentBody类型的子类,如FileBody、InputStreamBody、StringBody,通过这些类我们可以将String、File以及InputStream类型的数据转换成ContentBody类型的数据。
3.通过addTextBody方法我们可以很方便的添加文本数据。
2.通过HttpCient上传文件
Android端需要添加httpcore-4.3.2.jar、httpmime-4.3.5.jar两个包。两个包缺一不可。
在这里我用的是最新版的HttpCient,大家可以从http://hc.apache.org/downloads.cgi上下载所需要的jar包,如果上面的网站打不开,大家也不用担心,我已经将项目中所需要的jar包上传到CSDN上《httpcomponents-client-4.3.5-bin.zip》需要的朋友可以去下载。
Android端项目核心代码:
[java] view plain copy
HttpClient client=new DefaultHttpClient();// 开启一个客户端 HTTP 请求
HttpPost post = new HttpPost(url);//创建 HTTP POST 请求
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
// builder.setCharset(Charset.forName("uft-8"));//设置请求的编码格式
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);//设置浏览器兼容模式
int count=0;
for (File file:files) {
// FileBody fileBody = new FileBody(file);//把文件转换成流对象FileBody
// builder.addPart("file"+count, fileBody);
builder.addBinaryBody("file"+count, file);
count++;
}
builder.addTextBody("method", params.get("method"));//设置请求参数
builder.addTextBody("fileTypes", params.get("fileTypes"));//设置请求参数
HttpEntity entity = builder.build();// 生成 HTTP POST 实体
post.setEntity(entity);//设置请求参数
HttpResponse response = client.execute(post);// 发起请求 并返回请求的响应
if (response.getStatusLine().getStatusCode()==200) {
return true;
}
return false;
代码分析:
上面代码主要实现了多文件上传,为了方便服务器端保存文件,上面代码设置了名称为fileTypes的参数,fileTypes是由上传的文件类型名拼接成的字符串,如”.jpg.png.docx“;
服务器端可以通过获取名为fileTypes的参数,然后将其拆分成字符数组,即可得到要保存文件的类型。
服务器端项目核心代码:
服务器段主要用到Servlet3.0的API,主要用到的方法有:
1. request.getParameter("");//获取客户端通过addTextBody方法添加的String类型的数据。
2. request.getPart("");//获取客户端通过addBinaryBody、addPart、addTextBody方法添加的指定数据,返回Part类型的对象。
3. request.getParts();//获取客户端通过addBinaryBody、addPart、addTextBody方法添加的所有数据,返回Collection<Part>类型的对象。
4. part.getName();//获取上传文件的名称即上传时指定的key。
5. part.getSize()//获取上传文件的大小单位为字节。
[java] view plain copy
String fileTypes=request.getParameter("fileTypes");//获取客户端上传的所有文件类型
String[]typeArray=fileTypes.substring(1).split("\\.");//将文件类型字符串拆分成String数组
try {
Iterator<Part>iterator=request.getParts().iterator();
int count=0;
while (iterator.hasNext()) {//遍历客户端上传的所有文件
if (count>=typeArray.length)break;//如果超出文件类型数组的大小则跳出循环
Part part = (Part) iterator.next();
// System.out.println("part.getSize()"+part.getSize());//获取上传文件的大小
// System.out.println("part.getName()"+part.getName());//获取上传文件的名及添加数据时的key名
File file=new File("E:\\upload\\"+count+"."+typeArray[count++]);
InputStream inputStream=part.getInputStream();
FileOutputStream fos=new FileOutputStream(file);
byte[]buffer=new byte[1024];
int len=0;
while ((len=inputStream.read(buffer))!=-1) {
fos.write(buffer,0, len);
}
inputStream.close();
fos.close();
}
}catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
代码分析:
服务器端是通过Servlet实现的,通过调用request.getParameter("fileTypes")方法来获取客户端上传的所有文件类型,然后将文件类型字符串拆分成String数组。通过request.getParts()方法取出客户端通过addBinaryBody、addPart、addTextBody上传的所有数据,然后遍历数据集合即可进行文件的保存。
由于事先和客户端协定,添加上传文件的顺序在添加请求参数之前,所以可以根据拆分出的文件类型数组的长度判断出客户端上传文件的个数,因此当上面代码遍历超出了类型数组的长度时程序跳出循环,不再进行文件的保存,因为下面的Part都是些参数,而不是要保存的文件了
https://blog.csdn.net/demon_huirong/article/details/51878077
发表评论
-
c3p0代码动态切换数据源
2018-08-06 17:54 1081public class PARPDatasource imp ... -
sql 优化开多个线程跑
2018-07-11 09:54 684select /*+ parallel(8) */ * fr ... -
redis 事物限制频率和获得令牌
2018-07-11 02:50 928package com.dongnaoedu.tony.ser ... -
Redis分布式锁解决抢购问题
2018-07-11 02:39 1331废话不多说,首先分享一个业务场景-抢购。一个典型的高并发问题, ... -
StringWriter 接收异常信息
2018-07-05 18:42 450try { int a=1/0; } catch (E ... -
RedisCacheServiceUtil
2018-06-29 15:06 384package com.paic.icorepnbs.web. ... -
jedis 操作redis
2018-06-26 09:13 370//连接redis ,redis的默认端口是6379 Je ... -
多线程缓存优化思想
2018-06-06 15:33 3681.背景 题库 随机生成N张试卷,每张试卷M个题目,每个题目要 ... -
oracle 正则表达式 替换 ‘’:
2018-05-18 18:04 589select /*+ parallel(8) */ t.na ... -
java web 导出 下拉 excle
2018-05-15 17:03 466@RequestMapping(value = "/ ... -
Java Socket编程
2016-12-28 23:28 341对于Java Socket编程而言,有两个概念,一个是Serv ... -
Java多线程学习(吐血超详细总结)
2016-12-27 17:15 418目录(?)[-] 1.一扩展javalangThread类 2 ... -
JAVA多线程实现的三种方式
2016-12-27 17:16 420Java多线程实现方式主要有三种:继承Thread类、实现Ru ... -
Maven 入门菜鸟教程
2016-12-02 10:02 1180学习maven的使用,看到一篇很实用的入门教程(菜鸟级入门) ... -
Java 读写Properties配置文件
2016-08-22 15:00 406Java 读写Properties配置文件 1.Pro ... -
JAVA前端与后端参数传递方法小结
2016-07-26 10:54 46641,从Action中传值到JSP页面的方法 ①在Actio ... -
苟富贵
2013-02-25 09:43 0额梵蒂冈过v梵蒂冈北方多汇报地方环保 -
Request的getParameter和getAttribute方法的区别
2013-01-22 10:01 650HttpServletRequest.getParameter ... -
Eclipse快捷键小结
2012-12-26 11:26 739Eclipse快捷键小结 Eclipse ... -
JAVA去空格
2012-12-20 16:53 656String ccc=” he l l o , w o r l ...
相关推荐
总的来说,这个Java Swing 文件批量上传DEMO涵盖了Java GUI编程、文件I/O、网络编程、多线程以及用户交互等多个方面,对于初学者来说,是一个很好的实践项目,可以帮助他们深入理解Java Swing的应用及文件上传的实现...
在IT行业中,尤其是在Web开发领域,用户经常需要上传文件,如图片、文档等。为了提供良好的用户体验,开发者通常会引入进度条功能,让用户能够实时了解上传进度。本压缩包"‘C#批量上传 进度条(包括各种上传例子)...
在C#编程环境中,开发文件批量上传到百度云的功能是一项常见的任务,特别是在处理大量数据或者进行备份时。这里,我们主要关注如何利用C#和VS2008来实现这一功能,以及百度云的上传限制。 首先,我们需要了解C#的...
在C# WinForm应用开发中,处理多张图片的预览和批量上传是一项常见的任务,尤其是在构建用户界面时。此项目“C# WinFrom多张多图片预览和批量上传”旨在提供一种方法来实现这一功能。下面我们将深入探讨相关的知识点...
在Java编程环境中,批量上传图片是一项常见的任务,特别是在构建Web应用程序或者处理大量媒体资源时。这个过程涉及到文件I/O操作、多线程处理、网络通信等多个技术领域。下面将详细阐述实现这一功能所需的关键知识点...
"表明了这个压缩包包含的是关于C#编程语言中处理大文件上传和批量文件上传的技术知识。C#是一种广泛用于开发Web应用程序、桌面应用程序以及游戏的.NET框架语言,其在文件上传功能上提供了强大的支持。 描述中的...
5. **错误处理**:在批量上传过程中,可能会遇到文件过大、网络中断等各种问题,需要适当的错误处理机制,如重试、断点续传等。 6. **进度反馈**:为了给用户更好的交互体验,可以实时显示上传进度。可以使用事件...
事件处理器中包含实际的文件上传逻辑,比如使用HttpURLConnection或Apache HttpClient等网络库将文件发送到服务器。 5. 错误处理:当上传过程中发生错误,比如网络问题或服务器返回错误,应用应该能捕获异常,并...
例如,我们可以通过设置FtpWebRequest对象的Uri、Method、Credentials等属性,然后调用GetRequestStream()方法上传文件,或者使用GetResponse()获取文件信息。 HTTP(超文本传输协议)是互联网上应用最为广泛的一种...
在Java编程领域,上传文件到服务器是一项常见的任务,特别是在Web应用程序开发中。这个过程涉及到客户端(通常是用户设备上的Java程序)与服务器之间的数据传输,通常通过HTTP或HTTPS协议完成。以下是一些关于“java...
标题中的“批量上传的很好插件(.net)”指的是在.NET框架下开发的一种专门用于批量上传文件的插件。这类插件通常能极大地提高文件上传的效率,尤其在处理大量文件时,比单个文件逐个上传更为便捷。批量上传功能在网站...
在C#编程环境中,实现多服务器多文件上传的实例是一个涉及网络编程、并发处理和分布式系统设计的重要技术问题。在大型应用或者云服务环境中,为了提高系统的可用性和可靠性,通常会采用多服务器集群架构。本实例就是...
- 对于Web应用,可以使用`HttpClient`类发送POST请求来上传文件。需要创建一个`MultipartFormDataContent`实例,添加每个文件作为`HttpContent`,然后将其作为请求体发送。 6. **多线程或并行处理**: - 当上传...
这意味着用户可能无法批量上传文件,但可以通过多次单个文件的上传来实现类似效果。为了扩展此功能,可以添加多文件选择的支持,例如通过OpenFileDialog的Multiselect属性。 总的来说,这个项目涵盖了C# WinForm的...
以上是实现Java自动上传文件的基本步骤和关键知识点。实际开发中,可能会根据具体需求和所用的服务(如FTP服务器、S3存储、阿里云OSS等)有所不同,但基本原理相似。请确保理解和适当地应用这些概念,以实现安全、...
4. **批量上传**:批量上传涉及处理多个文件或数据记录。开发者可能编写了一个循环,遍历用户选择的多个文件,然后逐一执行上传操作。这需要处理文件路径集合,并确保每个文件的上传操作都能正确执行。 5. **C#编程...
本文将详细介绍如何使用Java流来实现文件的下载、上传以及批量下载ZIP文件的操作。 首先,我们从文件下载开始。在Java中,我们可以使用`java.io`包中的`InputStream`和`OutputStream`类来实现文件的下载。以下是一...
4. **整个文件夹上传**:上传整个文件夹是一种批量处理大量文件的方法,减少了用户逐个选择文件的步骤。这可能涉及到递归遍历文件夹结构并将所有文件添加到上传队列的技术。 5. **Java实现**:Java作为一种跨平台的...
再者,"一键上传到远程服务器"涉及到网络编程和文件传输。在C#中,可以使用System.Net命名空间下的WebClient类或者更高级的HttpClient类来实现FTP或HTTP(S)上传。配置目标服务器的URL、用户名、密码和其他必要参数,...
- 文件传输:实现一个文件上传/下载服务,展示大文件传输的处理策略。 10. **性能优化** - 网络性能分析:了解网络性能指标,如带宽、延迟等。 - 优化技巧:如何通过缓存、批量处理等方式提升网络应用的性能。 ...