httpclient组件使用经验
---------------------
文件上传:
---------------------
1.httpclient也可以使用putmethod方法
2.通过 putmethod.addRequestHeader(key,vaule)设置请求头部。也可设置一自定义的值,供服务端读出。
3.要实现文件上传不出现乱码问题,有以下几个注意点:
1)http协议的乱码部分分为URI部分、Header部分以及Body部分。
2)首先服务端的容器需要设置URI编码,如:tomcat配置文件中,对相关的访问端口设置URIEncoding="UTF-8"。
3)在服务端的web.xml中,设置fileter对编码进行过滤转码
4)对于uri中或是header中的中文在传间编码,服务端接收时解码。java.net.URLDecoder/URLEncoder.
4.文件上传的各种方式方法:
1)客户端可以通过将文件流直接塞进请求体RequestEntity,如:put.setRequestEntity(InputStreamRequestEntity entity),
服务端通过request.getInputStream()获取。
InputStream in = request.getInputStream(); // 文件流获取
OutputStream out = new FileOutputStream(file);
byte[] buffer = new byte[8196];
int n;
while((n = in.read(buffer, 0, buffer.length)) != -1) {
out.write(buffer, 0, n);
}
out.close();
2)客户端可以通过Part与MultipartRequestEntit方式,将上传内容塞进请求体。
服务端通过request.getInputStream()方式-----这种有可能上传文件不能看。
客户端塞内容:
File targetFile = new File("1.mp3");
Part[] parts = { new FilePart(targetFile.getName(), targetFile) };
filePost.setRequestEntity(new MultipartRequestEntity(parts,filePost.getParams()));
HttpClient client = new HttpClient();
client.getHttpConnectionManager().getParams().setConnectionTimeout(5000);
int status = client.executeMethod(filePost);
服务端取内容:
// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();
// Set factory constraints
factory.setSizeThreshold(4096); // 设置缓冲区大小,这里是4kb
factory.setRepository(tempPathFile);// 设置缓冲区目录
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// Set overall request size constraint
upload.setSizeMax(4194304); // 设置最大文件尺寸,这里是4MB
List<FileItem> items = upload.parseRequest(request);// 得到所有的文件
Iterator<FileItem> i = items.iterator();
while (i.hasNext())
{
FileItem fi = (FileItem) i.next();
String fileName = fi.getName();
if (fileName != null)
{
File fullFile = new File(fi.getName());
File savedFile = new File(uploadPath, fullFile.getName());
fi.write(savedFile);
}
3)还有其它方式,如直接使用MultipartPostMethod方法上传。还没有深入研究。
4.文件流读取使用OutputStream写入时需要注意:
OutputStream有几种write方法,尽量采用write(byte[] b, int off, int len)方法。
write(byte[] b) : 使用些方法写入,容易使文件比原文件增大0~你指定的len大小。从而使你的文件可以无法正常显示。尤其在最后一片的读写时易增大。
write(byte[] b, int off, int len):每次跟据读入情况,确定每次写入大小,不易出现异常。
write(int b) :
OutputStream out = new FileOutputStream(file);
byte[] buffer = new byte[8196];
int n;
while((n = in.read(buffer, 0, buffer.length)) != -1) {
System.out.println("------n--------" +n);
System.out.println("------buffer--------" +buffer.length);
out.write(buffer, 0, n);
}
out.close();
如上文中所错的测试结果:
------buffer--------8196
------n--------7983
.......
------buffer--------8196
------n--------7983
------buffer--------8196
------n--------3114
------buffer--------8196
说明:每次buffer的读取都未读满,不知是何原因。将指定的buffer大小改成2048再试:
--------------------------
遗留问题:
1.tomcat 中设置编码的作用?
2.web.xml中的filter的具体作用?
3.各种塞文件内容与取的方式,是否可以混 用?如果不能混用,他们的差异在哪,如何明确配对? 上面的方法是试过可行的,暂这么用。需要进一步了解深入。
4.在使用httpclient上传时,出现第次读的buffer示能读满,不知是何原因?
分享到:
相关推荐
httpClient组件使用说明,搭建,所需jar包,简单应用,例子。适用于初级学员
本文首先介绍 HTTPClient,然后根据作者实际工作经验给出了一些常见问题的解决方法。HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。...
HTTPClient组件的应用
ApacheCommons-HTTPClient组件的应用.doc
HttpClient组件及其在Android开发中的应用探讨.pdf
使用httpclient 3.0解析html,实际使用当中遇到的字符集编码乱码问题,主要用于网页的信息采集,此外还列出一部分截取字符串的方法,带源码 httpclient3.0 自己下载jar包
Httpclient,一个我们平时开发时经常用到的组件
为扩展而设计,同时为基本的HTTP协议提供强大的支持,HttpClient组件也许就是构建HTTP客户端应用程序,比如web浏览器,web服务端,利用或扩展HTTP协议进行分布式通信的系统的开发人员的关注点。 1. HttpClient的范围...
HttpClient配置SSL绕过https证书实例,附件中包含所需httpclient组件jar库。博客地址:http://blog.csdn.net/irokay/article/details/78801307。
httpclient组件 httpclient组件 httpclient组件 httpclient组件 httpclient组件 httpclient组件
Commons HTTPClient4.X组件应用示例
HttpClient组件HttpClient组件提供了强大的方法来同步或异步获取HTTP资源。 该组件是实验性的。 Symfony的向后兼容HttpClient组件未涵盖实验性功能。HttpClient组件提供了强大的方法来同步或异步获取HTTP资源。 资源...
实现了Java版的Promise 和 HttpClient。HttpClient 支持同步和异步两种方式,也支持多种不同实现。目前有Netty 和 Apache Compoenet两种实现。本次上传移除了Netty实现。主要解决生产环境中同步httpclient造成的IO...
HttpClient组件 HttpClient组件提供了强大的方法来同步或异步获取HTTP资源。 资源资源 并在
httpclient.jar JAVA扩展组件文件下载
NULL 博文链接:https://yhz61010.iteye.com/blog/654678
java组件开发(19)HttpClient
注意:Commons HttpClient项目现在已经结束了,不再被开发。它已经被Apache HttpClient和HttpCore模块中的HttpComponents项目所取代,这些模块提供了更好的性能和更多的灵活性 ————————————————