新浪微博SDK开发(2):上传图片的技术难点

时间:2021-10-20 02:02:38

在微博模块中,有一个API是可以发表带一张图片的微博的,当然提交方式是POST。在封装的时候,可能会遇到一个难点——如何上传图片?

要POST微博的同时带有图片,POST的内容必须为MultiPart form data格式的内容,这个呢,我用到.NET 45中新增的一个相当强大的HttpClient类,位于System.Net.Http命名空间下。这个类的好处在于,它把许多HTTP操作都封装了,让我们使用起来不至于过于痛苦。

源码下载:http://vdisk.weibo.com/s/z7iFc2gCCwC1b

无论是GET请求还是POST请求,HttpClient类都允许我们发送一个HttpContent对象,它封装了HTTP内容数据,当然它是一个抽象类,我们用的是它的派生类,请看下图:

新浪微博SDK开发(2):上传图片的技术难点

StringContent类是把一个字符串发送到服务器,StreamContent类表示数据内容以流的形式收发,FormUrlEncodedContent类封装的数据,说简单一点就是模拟我们在web页上form元素中填写的内容。

而既有文本又有图片文件的微博,应该使用MultipartFormDataContent来封装,即包含多个段的数据,正因其有多个 Content-Disposition段,我们需要弄一个字符串作为分隔符,在这里,就是把微博正文和图片文件的数据分隔开来,这个字符串常见的形式如“---------------------------a6ecd24f3a2b3cc5”。

于是,我在SDK中专为POST这种多段数据的HTTP内容写了一个SendRequestWithMultipartFormDataAsync,都是async方法,可以异步等待,这是新特性,有些人不太了解它,其实当你了解后,你会发现await异步等待其实很环保,也节省不少代码。

        internal static async Task<TResult> SendRequestWithMultipartFormDataAsync<TResult>(string relateUrl, IDictionary<string, object> parms, string filename)
{
Uri reqUri = new Uri(API_BASE_RUI);
reqUri = new Uri(reqUri, relateUrl);
TResult result = default(TResult);
using (HttpClient client = new HttpClient())
{
string b = "---------------------" + DateTime.Now.Ticks.ToString("x");
MultipartFormDataContent formData = new MultipartFormDataContent(b);
foreach (var pair in parms)
{
string str = pair.Value as string;
if (str != null)
{
StringContent stringContent = new StringContent(pair.Value as string);
formData.Add(stringContent, pair.Key);
} Stream stream = pair.Value as Stream;
if (stream != null)
{
StreamContent streamContent = new StreamContent(stream);
formData.Add(streamContent, pair.Key, filename);
}
}
var response = await client.PostAsync(reqUri, formData);
if (response.IsSuccessStatusCode)
{
using (Stream backstream = await response.Content.ReadAsStreamAsync())
{
result = JsonSerializeHelper.ReadDataFromJson<TResult>(backstream);
}
}
else
{
ErrorData err = null;
using (Stream errstream = await response.Content.ReadAsStreamAsync())
{
err = JsonSerializeHelper.ReadDataFromJson<ErrorData>(errstream);
}
throw new WeiboException(err);
}
} return result;
}

用于分隔内容的字符串,我是通过把DateTime对象中的Ticks这个数值转为十六进制字符串来实现的,也就是代码中的b变量。

1、new一个MultipartFormDataContent对象。

2、微博正文是字符串,所以用StringContent来封装,然后调用MultipartFormDataContent对象的Add方法加进去。

3、对于图片,我们可以使用流StreamContent,但要注意一个很关键的要素,就是在Add到multipart form data 内容中的时候一定要指定文件名。即调用以下重载:

public void Add(HttpContent content, string name, string fileName);

也就是必须为filename参数给予一个文件名,相对路径,绝对路径都无所谓,或者干脆一个文件名(如abc.jpg)都行。就是不能缺了这个参数,否则会上传失败。
将内容添加完毕后,就可以直接调用PostAsync方法向服务器POST数据了,完成后返回HttpResponseMessage类型的实例,它封装了服务器回应的各种消息,可通过IsSuccessStatusCode属性判断服务器是否返回正确的代码(OK,200)。Content属性返回服务器回应的消息正文。

这样,上传图片的问题就解决了。

新浪微博SDK开发(2):上传图片的技术难点的更多相关文章

  1. 新浪微博SDK开发(1):总述

    花了几天时间,消耗了九牛六虎之力,新浪微博大部分API已经封装,但有部分API实在太难封装. 说起这封装,我必须严重地.从人品和技术层面鄙视一下新浪的程序员,实在太菜了.估计菜鸟都被大企业吸收了,菜到 ...

  2. 新浪微博sdk bug

    最近在做一个 iOS 的 cocos2d-x 项目接入新浪微博 SDK 的时候被“坑”了,最后终于顺利的解决了.发现网上也有不少人遇到一样的问题,但是能找到的数量有限的解决办法写得都不详细,很难让人理 ...

  3. 《转》iOS 平台 Cocos2d-x 项目接入新浪微博 SDK 的坑

    最近在做一个 iOS 的 cocos2d-x 项目接入新浪微博 SDK 的时候被“坑”了,最后终于顺利的解决了.发现网上也有不少人遇到一样的问题,但是能找到的数量有限的解决办法写得都不详细,很难让人理 ...

  4. 插件化技术在安卓sdk开发中实际应用

    笔者从 2016 年初就因为公司业务需求转战 android sdk 开发, 应用插件化技术将公司 android sdk 重新翻版.先来说说需求. 由于笔者所在一家创业公司, android sdk ...

  5. 大华门禁SDK二次开发(一)-技术沟通

    项目中需要能够查询门禁信号和控制门禁设备,因此需要基于大华门禁SDK进行二次开发,开发语言C#.门禁开发中遇到了一些问题,经过与大华技术的邮件沟通也一一解决.做这个开发的时候,发现网上的资料比较少,想 ...

  6. 海康抓拍机SDK开发

    前言 项目采购的海康威视的抓拍机,需要首先获取抓拍图片,之后基于抓拍图片进行图像处理.本文基于海康SDK开发文档,按照开发步骤,咨询海康技术人员,现将开发过程记录如下. 主要过程的c++代码: /** ...

  7. 微信公众账号 Senparc&period;Weixin&period;MP SDK 开发教程 索引

    Senparc.Weixin.MP SDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到比较稳定的版本,这个过程中我觉得有必要整理一些思路和经验,和大家一起分享. ...

  8. 移动端IM开发需要面对的技术问题

    1.前言 这两年多一直从事网易云信 iOS 端 IM SDK的开发,期间不断有兄弟部门的同事和合作伙伴过来问各种技术细节,干脆统一介绍下一个IM APP的方方面面,包括技术选型(包括通讯方式,网络连接 ...

  9. 高拍仪拍照SDK开发(良田影像S300L&vert;S500L)

    高拍仪拍照SDK开发下载地址:点击下载 本SDK适用于:良田影像S300L|S500L 高拍仪如图: SDN开发包安装之后找到安装目录,如图: 大家找到各自需要的版本即可,需要注意的是如果需要上传图片 ...

随机推荐

  1. nginx File not found

    出现 nginx File not found 错误 首先判断这个文件是否 真的存在 如果文件确实存在 那么应该是 php-fpm 路径有问题了 解决办法 1查看 php-fpm 的配置文件 我的 文 ...

  2. 通过 Redis 实现 RPC 远程方法调用&lpar;支持多种编程语

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/101.html?1455869487 我发现经常研究并且为之兴奋的一件事就 ...

  3. ref和out

    网上对这两个关键字的讨论,已经很多了,先给出一个链接:http://blog.csdn.net/xiaoning8201/article/details/6893154 自己做几条笔记,记得牢一些: ...

  4. 会话数据的保存——cookie

    会话的理解 可以简单的理解为:用户打开浏览器,访问多个web资源,然后关闭浏览器,这个过程可以称为一次会话 有状态会话:可以简单理解为一个同学来了这个教室,下一次再来我们知道他来过这个教室,我们可以称 ...

  5. BZOJ1617&colon; &lbrack;Usaco2008 Mar&rsqb;River Crossing渡河问题

    1617: [Usaco2008 Mar]River Crossing渡河问题 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 654  Solved: 4 ...

  6. RS-232通信原理

    rs232串口通信原理 串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线Universal Serial Bus或者USB混淆).大多数计算机包含两个基于RS232的串口.串口同时也是仪器 ...

  7. JavaBean之属性必须遵循命名规范

    JavaBean中存在一些属性,今天写了一个Jsp的小例子.把Bean中的属性命名规范搞错了,具体的说属性的首字母大写了. 于是乎Jsp中读取属性时总是报错. javax.el.PropertyNot ...

  8. DALI调色温

    DALI调色温模块使用手册 公  司: 深圳市万秀电子有限公司 网  站: http://www.wanxiucx.com 总  机: 0755-23215689 联系人: 张先生 手  机: 139 ...

  9. 减少xcode错误输出

    运行xcrun相关命令如果出现找不到对应模块和工具,要确认一下在xcode中命令行工具是否正确设置了 xcrun simctl spawn booted log config --mode &quot ...

  10. 20145325张梓靖 《Java程序设计》第7周学习总结

    20145325张梓靖 <Java程序设计>第7周学习总结 教材学习内容总结 时间的度量 格林威治时间,简称GMT时间,由观察太阳而得来:世界时,UT:国际原子时,TAI:世界协调时间,U ...