android的自带的httpClient 怎么http协议上传文件原理

使用HttpClient实现文件的上传下载_Linux编程_Linux公社-Linux系统门户网站
你好,游客
使用HttpClient实现文件的上传下载
来源:Linux社区&
作者:Scott007
HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。
虽然在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient 用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。
一般的情况下我们都是使用Chrome或者其他浏览器来访问一个WEB服务器,用来浏览页面查看信息或者提交一些数据、文件上传下载等等。所访问的这些页面有的仅仅是一些普通的页面,有的需要用户登录后方可使用,或者需要认证以及是一些通过加密方式传输,例如HTTPS。目前我们使用的浏览器处理这些情况都不会构成问题。但是一旦我们有需求不通过浏览器来访问服务器的资源呢?那该怎么办呢?
下面以本地客户端发起文件的上传、下载为例做个小Demo。HttpClient有两种形式,一种是org.apache.http下的,一种是org.apache.commons.httpclient.HttpClient。
2 文件上传
文件上传可以使用两种方式实现,一种是PostMethod方式,一种是HttpPost方式。两者的处理大同小异。PostMethod是使用FileBody将文件包装流包装起来,HttpPost是使用FilePart将文件流包装起来。在传递文件流给服务端的时候,都可以同时传递其他的参数。
Adroid 4.0 HttpURLConnection抛异常解决方法
node.js+(使用HttpURLConnection和HttpClient)实现文件上传
在Android上用HttpURLConnection获取网页内容
2.1 客户端处理
2.1.1 PostMethod方式
将文件封装到FilePart中,放入Part数组,同时,其他参数可以放入StringPart中,这里没有写,只是单纯的将参数以setParameter的方式进行设置。此处的HttpClient是org.apache.commons.httpclient.HttpClient。
1 public void upload(String localFile){
File file = new File(localFile);
PostMethod filePost = new PostMethod(URL_STR);
HttpClient client = new HttpClient();
// 通过以下方法可以模拟页面参数提交
filePost.setParameter("userName", userName);
filePost.setParameter("passwd", passwd);
Part[] parts = { new FilePart(file.getName(), file) };
filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost.getParams()));
client.getHttpConnectionManager().getParams().setConnectionTimeout(5000);
int status = client.executeMethod(filePost);
if (status == HttpStatus.SC_OK) {
System.out.println("上传成功");
System.out.println("上传失败");
} catch (Exception ex) {
ex.printStackTrace();
} finally {
filePost.releaseConnection();
记得搞完之后,要通过releaseConnection释放连接。
2.1.2 HttpPost方式
这种方式,与上面类似,只不过变成了FileBody。上面的Part数组在这里对应HttpEntity。此处的HttpClient是org.apache.http.client.methods下的。
1 public void upload(String localFile){
CloseableHttpClient httpClient = null;
CloseableHttpResponse response = null;
httpClient = HttpClients.createDefault();
// 把一个普通参数和文件上传给下面这个地址 是一个servlet
HttpPost httpPost = new HttpPost(URL_STR);
// 把文件转换成流对象FileBody
FileBody bin = new FileBody(new File(localFile));
StringBody userName = new StringBody("Scott", ContentType.create(
"text/plain", Consts.UTF_8));
StringBody password = new StringBody("123456", ContentType.create(
"text/plain", Consts.UTF_8));
HttpEntity reqEntity = MultipartEntityBuilder.create()
// 相当于&input type="file" name="file"/&
.addPart("file", bin)
// 相当于&input type="text" name="userName" value=userName&
.addPart("userName", userName)
.addPart("pass", password)
httpPost.setEntity(reqEntity);
// 发起请求 并返回请求的响应
response = httpClient.execute(httpPost);
System.out.println("The response value of token:" + response.getFirstHeader("token"));
// 获取响应对象
HttpEntity resEntity = response.getEntity();
if (resEntity != null) {
// 打印响应长度
System.out.println("Response content length: " + resEntity.getContentLength());
// 打印响应内容
System.out.println(EntityUtils.toString(resEntity, Charset.forName("UTF-8")));
EntityUtils.consume(resEntity);
}catch (Exception e){
e.printStackTrace();
}finally {
if(response != null){
response.close();
} catch (IOException e) {
e.printStackTrace();
if(httpClient != null){
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
更多详情见请继续阅读下一页的精彩内容:
相关资讯 & & &
& (08/01/:07)
& (08月25日)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款Android HttpClient上传文件与Httpconnection知识小结
&上传文件到服务端可以使用HttpConnection 上传文件,也可以使用Android封装好的HttpClient类。当仅仅上传文件可以直接使用httpconnection 上传比较方便快捷。
&&&&&&& 1、使用HttpConection上传文件。将文件转换成表单数据流。主要的思路就自己构造个http协议内容,服务端解析报文获得表单数据。代码片段:
&&& try {&
&&&&&&& con = (HttpURLConnection) url.openConnection();&
&&&&&&& con.setConnectTimeout(C_TimeOut);&
&&&&&&& /* 允许Input、Output,不使用Cache */&
&&&&&&& con.setDoInput(true);&
&&&&&&& con.setDoOutput(true);&
&&&&&&& con.setUseCaches(false);&
&&&&&&& /* 设置传送的method=POST */&
&&&&&&& con.setRequestMethod(&POST&);&
&&&&&&& /* setRequestProperty */&
&&&&&&& con.setRequestProperty(&Connection&, &Keep-Alive&);&
&&&&&&& con.setRequestProperty(&Charset&, &UTF-8&);&
&&&&&&& con.setRequestProperty(&Content-Type&,&multipart/form-boundary=& + boundary);&
&&&&&&& /* 设置DataOutputStream */&
&&&&&&&& DataOutputStream ds = new DataOutputStream(con.getOutputStream());&
&&&&&&&& FileInputStream fStream = new FileInputStream(file);&
&&&&&&&&& /* 设置每次写入1024bytes */&
&&&&&&&&& int bufferSize = 1024;&
&&&&&&&&& byte[] buffer = new byte[bufferSize];&
&&&&&&&&& int length = -1;&
&&&&&&&&& /* 从文件读取数据至缓冲区 */&
&&&&&&&&& while((length = fStream.read(buffer)) != -1)&
&&&&&&&&& {&
&&&&&&&&&&& /* 将资料写入DataOutputStream中 */&
&&&&&&&&&&& ds.write(buffer, 0, length);&
&&&&&&&&& }&&
&&&&&&&&& fStream.close();&&
&&&&&&&&& ds.flush();&
&&&&&&&&& ds.close();&
&&&&&&&&&&
&&&&&&& ①《在 Android 上通过模拟 HTTP multipart/form-data 请求协议信息实现图片上传》&&&&&&&&&&&& ②《关于android Http访问,上传,用了三个方法 》
2、使用Android HttpClient类上传参数。下面我在网上搜到得代码,忘记出处了
private static boolean sendPOSTRequestHttpClient(String path,&
&&&&&&& Map&String, String& params) throws Exception {&
&&& // 封装请求参数&
&&& List&NameValuePair& pair = new ArrayList&NameValuePair&();&
&&& if (params != null && !params.isEmpty()) {&
&&&&&&& for (Map.Entry&String, String& entry : params.entrySet()) {&
&&&&&&&&&&& pair.add(new BasicNameValuePair(entry.getKey(), entry&
&&&&&&&&&&&&&&&&&&& .getValue()));&
&&&&&&& }&
&&& // 把请求参数变成请求体部分&
&&& UrlEncodedFormEntity uee = new UrlEncodedFormEntity(pair, &utf-8&);&&
&&& // 使用HttpPost对象设置发送的URL路径&
&&& HttpPost post = new HttpPost(path);&&
&&& // 发送请求体&
&&& post.setEntity(uee);&&
&&& // 创建一个对象,以把POST对象向服务器发送,并返回响应消息&
&&& DefaultHttpClient dhc = new DefaultHttpClient();&
&&& HttpResponse response = dhc.execute(post);&
&&& if (response.getStatusLine().getStatusCode() == 200) {&
&&&&&&& Log.i(&http&, &httpclient&);&
3、使用httpClient上传文字信息和文件信息。使用httpClient上传文件非常的方便。不过需要导入apache-mime4j-0.6.jar 和httpmime-4.0.jar两个.jar包。
// 封装请求参数&
&&&&&&& MultipartEntity mpEntity = new MultipartEntity();&
&&&&&&& if (params != null && !params.isEmpty()) {&
&&&&&&&&&&& for (Map.Entry&String, String& entry : params.entrySet()) {&
&&&&&&&&&&&&&&& StringBody par = new StringBody(entry.getValue());&
&&&&&&&&&&&&&&& mpEntity.addPart(entry.getKey(), par);&
&&&&&&&&&&& }&
&&&&&&& }&
&&&&&&& // 图片&
&&&&&&& if (!imagepath.equals(&&)) {&
&&&&&&&&&&& FileBody file = new FileBody(new File(imagepath));&
&&&&&&&&&&& mpEntity.addPart(&photo&, file);&
&&&&&&& }&
&&&&&&& // 使用HttpPost对象设置发送的URL路径&
&&&&&&& HttpPost post = new HttpPost(path);&
&&&&&&& // 发送请求体&
&&&&&&& post.setEntity(mpEntity);&
&&&&&&& // 创建一个浏览器对象,以把POST对象向服务器发送,并返回响应消息&
&&&&&&& DefaultHttpClient dhc = new DefaultHttpClient();&
&&&&&&& HttpResponse response = dhc.execute(post);&
FileBody类可以把文件封装到表单中,实现附件的上传。&
&作者:安客成android&httpclient连接服务器传递包含文件图片的参数方法
这是做项目中使用到的方式,在这种方式中使用httpclient时还需要httpmime-4.1.2.jar包,很好下载。
贴上核心代码:
HttpPost request = new
HttpPost(postUrl);
FileBody img_file = new
FileBody(new File(filename));
&//这里是文件图片
StringBody key_body = new
StringBody(app_key);
StringBody item_body = new
StringBody(item);
MultipartEntity mpEntity = new
MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
mpEntity.addPart("key_body",
key_body);
mpEntity.addPart("item_body",
item_body);
mpEntity.addPart("img_file",
img_file);
request.setEntity(mpEntity);
HttpResponse response =
httpclient.execute(request);
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。&&&&&&&&&&&&android中利用httpclient上传文件
正在努力加载播放器,请稍等…
正在努力加载播放器
所需财富值:
0文件大小:17.25KB
您当前剩余财富值:&&
大小:17.25KB&&所需金币:50
&& & 金币不足怎么办?
下载量:-次 浏览量:1145次
贡献时间: 18:30:01
文档标签:
已有-位用户参与评分
同类热门文档
你可能喜欢
看过这篇文档的还看过
阅读:673&&下载:9
阅读:2707&&下载:5
阅读:596&&下载:3
阅读:1074&&下载:2
阅读:748&&下载:2
阅读:660&&下载:1
阅读:647&&下载:1
阅读:215&&下载:0
阅读:330&&下载:0
阅读:156&&下载:0
该用户的其他文档
所需财富值:
50文件大小:17.25KB
您当前剩余财富值:&&
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
举报该文档侵犯版权。
例: http://wenku.it168.com/help.shtml

我要回帖

更多关于 httppost上传文件流 的文章

 

随机推荐