好了,之前我们已经获取到了需要发送的图片存在于手机中的路径,也就是上一篇文章中的picPath,那么我们今天通过这个路径将图片发出去。
先看新浪微博对发送图片的说明:http://open.weibo.com/wiki/Statuses/upload。在注意事项中新浪写到:上传图片需要采用multipart/form-data方式提交pic参数,并且放在POST请求的body里。另外,只有以oauth_开头的参数才需要参加OAuth的签名。
我们可以采取两种方法来实现这样的一个post方法,1、通过HttpURLConnectiion自己构造一个http请求的全部内容2、同样是通过HttpClient开源项目,但是我们需要添加一个额外的包,包名为:httpmine-4.X,大家可以自行下载。
首先给出第一种方法,此处参考http://www.itivy.com/android/archive/2011/7/6/android-weibo-oauth-send-text-and-image.html给出的方法实现,特别感谢。
/*
* 新浪微博发送图片post方法,自己构造相应的请求内容
*/
public String uploadStatus(File aFile, String status, String urlPath)
throws OAuthMessageSignerException,
OAuthExpectationFailedException, OAuthCommunicationException,
IOException {
OAuthConsumer httpOAuthConsumer = new DefaultOAuthConsumer(
consumer.getConsumerKey(), consumer.getConsumerSecret());
httpOAuthConsumer.setTokenWithSecret(consumer.getToken(),
consumer.getTokenSecret());
String result = null;
URL url = new URL(urlPath);
HttpURLConnection request = (HttpURLConnection) url.openConnection();
request.setDoOutput(true);
request.setDoInput(true);
request.setRequestMethod("POST");
HttpParameters para = new HttpParameters();
para.put("status",
URLEncoder.encode(status, "utf-8").replaceAll("\\+", "%20"));
// para.put("source",URLEncoder.encode(status,
// "utf-8").replaceAll("\\+", "%20"));
String boundary = "---------------------------37531613912423";
String content = "--" + boundary
+ "\r\nContent-Disposition: form-data; name=\"status\"\r\n\r\n";
String pic = "\r\n--"
+ boundary
+ "\r\nContent-Disposition: form-data; name=\"pic\"; filename=\"image.jpg\"\r\nContent-Type: image/jpeg\r\n\r\n";
byte[] end_data = ("\r\n--" + boundary + "--\r\n").getBytes();
FileInputStream stream = new FileInputStream(aFile);
byte[] file = new byte[(int) aFile.length()];
stream.read(file);
request.setRequestProperty("Content-Type",
"multipart/form-data; boundary=" + boundary); // 设置表单类型和分隔符
request.setRequestProperty(
"Content-Length",
String.valueOf(content.getBytes().length
+ status.getBytes().length + pic.getBytes().length
+ aFile.length() + end_data.length)); // 设置内容长度
//
// 下面的步骤是对请求进行签名。
httpOAuthConsumer.setAdditionalParameters(para);
httpOAuthConsumer.sign(request);
//讲相应的请求参数写入到entity中
OutputStream ot = request.getOutputStream();
ot.write(content.getBytes());
ot.write(status.getBytes());
ot.write(pic.getBytes());
ot.write(file);
ot.write(end_data);
ot.flush();
ot.close();
request.connect();
InputStream is = request.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line = null;
StringBuffer sb = new StringBuffer();
while ((line = reader.readLine()) != null) {
sb.append(line);
}
result = sb.toString();
System.out.println("reuslt---->" + result);
System.out.println(request.getResponseMessage());
/*
* if (200 == request.getResponseCode()) { result = "SUCCESS"; }
*/
return result;
}
构造原理,在新浪微博注意事项中已经写的十分清楚,此处就不再做过多的解释。这里尤其值得注意的是:写入的占位符\r\n等均不可缺少,不然无法构造正确的请求内容。
第二种方法:
/*
* 新浪微博发送图片post方法
*/
public String doPostWithMultipart(String url,List<NameValuePair> pairs,String pic) throws IllegalCharsetNameException, UnsupportedCharsetException, ClientProtocolException, IOException, OAuthMessageSignerException, OAuthExpectationFailedException, OAuthCommunicationException{
HttpPost postRequest = new HttpPost(url);
MultipartEntity reqEntity = new MultipartEntity();
for(NameValuePair p:pairs){
reqEntity.addPart(p.getName(),new StringBody(p.getValue(),Charset.forName("UTF-8")));
}
FileBody filebody = new FileBody(new File(pic),"image/jpeg");
reqEntity.addPart("pic",filebody);
postRequest.setEntity(reqEntity);
consumer.sign(postRequest);
HttpClient httpclient = new DefaultHttpClient();
HttpResponse response = null;
response = httpclient.execute(postRequest);
String result = ApacheUtils.getResponseText(response);
return result;
}
两种方法均可使用
分享到:
相关推荐
Android:SNS客户端开发八:发送带图片的微博 第一种方法
基于安卓Android的SNS社交网络客户应用需求调研报告范本.pdf基于安卓Android的SNS社交网络客户应用需求调研报告范本.pdf基于安卓Android的SNS社交网络客户应用需求调研报告范本.pdf基于安卓Android的SNS社交网络客户...
报报告:SNS在中国的机会及未来发展趋向报报告:SNS在中国的机会及未来发展趋向
本人在12年7月份研究android如何与SNS网站接入时写的备忘录,主要信息也是收集于各SNS网站的接入开发说明,然后加以精简,希望节省大家时间,对大家有帮助。主要网站包括开心网、腾讯微博、新浪微博、人人网。
路过插件.开源sns必备插件。
电子商务案例分析:SNS平台案例.ppt
人人都玩开心网:Ext+JS+Android+SSH整合开发Web与移动SNS
目前支持:新浪微博、腾讯微博、搜狐微博、网易微博、百度说吧、139说客、嘀咕、饭否、做啥、人间网、天涯微博、人民微博、新华微博、Google Buzz、豆瓣、凤凰微博、开心网、人人网、和讯微博、中金微博、Follow5、...
Android娱乐多媒体软件、赶集网手机客户端、移动办公、来电管理器、短信监控器、电话监控器、手机安全软件、手机守护神、新浪微博客户端、贪吃蛇游戏、数独游戏。 Java虚拟机实现、基于分布式架构的大型B2C电子商务...
中国的SNS路径?(之二)新浪微博不是Twitter.docx
目前支持:新浪微博、腾讯微博、搜狐微博、网易微博、百度说吧、移动微博、嘀咕、饭否、做啥、人间网、天涯微博、人民微博、新华微博、Google Buzz、豆瓣、凤凰微博、QQ空间、开心网、人人...,共20多家微博及SNS网站...
阿里投资新浪微博:马云的SNS之梦.docx
Android的SNS App源码,内容自己看哈,互相交流学习下
开心网CEO程炳皓:SNS的3个方向.docx
我的第二个android sns应用程序。 与相比,此应用程序是升级版本。 잭트는 진화된잭트NS NS케케케케케NS NS NS。 。른른。구현했습니구현했습니구현했습니구현했습니。 목차 기술스택 언어: Java,PHP,...
记事狗微博系统采用php mysql开发并开源发布,可承载千万级用户,其支持Wap、3G、Android客户端、iphone客户端、短信、微信等多种方式发布内容,并可选择同步到主流的微博平台(也支持微博帐户登录),内置的插件和...
拥有Web端、iOS、Android客户端以及H5手机版;其轻量化的应用模式,稳固的底层架构,强大的延伸性,支持二次开发拓展。自主版本IM聊天系统,让及时聊天功能不在产生额外花费。朋友圈、微吧、话题、频道、找伙伴、商城...
Android经典开发---豆瓣网移动客户端 讲解+源代码
基于安卓Android的SNS社交网络客户应用需求调研报告范本.docx基于安卓Android的SNS社交网络客户应用需求调研报告范本.docx基于安卓Android的SNS社交网络客户应用需求调研报告范本.docx基于安卓Android的SNS社交网络...
记事狗微博系统是一套创新的互动社区系统,其以微博为核心,兼有轻博、SNS和BBS特点,既可用来独立建站也可通过Ucenter和oauth接口与已有网站无缝整合,通过微博评论模块、关注转发机制打通全站的信息流、关系流,可...