.net C#写钉钉上传素材接口解决返回系统繁忙问题

本片主要解决“type=file时是可行的,type=image时不知为何总是提示【系统繁忙】”的问题。

钉钉上传素材的API文档写的比较简单,尤其是http头那块完全没写,demo也没有.net的,杯具啊。

看了一位仁兄的帖子,原理写的很清楚,大家可以参考一下。

http://blog.csdn.net/xxdddail/article/details/51983487

但有一个问题没有解决,文章里也提到了,就是type=file时是可行的,type=image时不知为何总是提示【系统繁忙】

研究了好几天,参考了下面这位仁兄的代码

https://github.com/icodegame/DTSigninRemind

终于找到了问题,貌似是C#提供的WebClient本身的,改用HttpWebRequest解决了问题。

在自定义头一样的情况下WebClient不行,但HttpWebRequest可以。

想了解http头的话,请看这一篇,http://blog.csdn.net/xiaojianpitt/article/details/6856536

上面github上的仁兄代码是异步的,我需要同步方式,就直接改成同步的了。如果需要异步的代码可以用上面链接里的代码。

代码如下

 1 public static string PostFile(string url, string fileWithPath)
 2         {
 3             var result = string.Empty;
 4             var request = (HttpWebRequest)WebRequest.Create(url);
 5             var boundary = "----------" + DateTime.Now.Ticks.ToString("x");
 6             request.ContentType = "multipart/form-data; boundary=" + boundary;
 7             request.Method = "POST";
 8             using (Stream requestStream = request.GetRequestStream())
 9             {
10                 byte[] boundarybytes = Encoding.UTF8.GetBytes("--" + boundary + "\r\n");
11                 byte[] trailer = Encoding.UTF8.GetBytes("\r\n--" + boundary + "–-\r\n");
12                 var filename = Path.GetFileName(fileWithPath);
13                 using (FileStream fs = new FileStream(fileWithPath, FileMode.Open, FileAccess.Read))
14                 {
15                     byte[] bArr = new byte[fs.Length];
16                     fs.Read(bArr, 0, bArr.Length);
17                     requestStream.Write(boundarybytes, 0, boundarybytes.Length);
18                     var header = $"Content-Disposition:form-data;name=\"media\";filename=\"{filename}\"\r\nfilelength=\"{fs.Length}\"\r\nContent-Type:application/octet-stream\r\n\r\n";
19                     byte[] postHeaderBytes = Encoding.UTF8.GetBytes(header.ToString());
20                     requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
21                     fs.Close();
22                     requestStream.Write(bArr, 0, bArr.Length);
23                     requestStream.Write(trailer, 0, trailer.Length);
24                 }
25             }
26             var response = (HttpWebResponse)request.GetResponse();
27             var responseStream = response.GetResponseStream();
28             using (var streamReader = new StreamReader(response.GetResponseStream()))
29             {
30                 result = streamReader.ReadToEnd();
31             }
32             return result;
33         }

调用代码

1 var fileName = @"d:\a.jpg";
2 var url = $"https://oapi.dingtalk.com/media/upload?access_token={access_token}&type=image";
3 var requestResult = PostFile(url, fileName);

返回的结果

时间: 2024-10-12 21:55:18

.net C#写钉钉上传素材接口解决返回系统繁忙问题的相关文章

java微信接口之四—上传素材

一.微信上传素材接口简介 1.请求:该请求是使用post提交地址为: https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token=ACCESS_TOKEN 其中ACCESS_TOKEN是我们动态获取的. 发送的数据: {"articles":[ { "thumb_media_id":"qI6_Ze_6PtV7svjolgs-rN6stStuHIjs9_DidOHaj0Q-mwvBelOXC

java微信公众平台开发四(上传素材)

最近公司要做微信方面的开发,今天说下,如何使用微信的素材管理的接口,这里主要讲下素材的上传接口,下载之类的比较简单(就是解析json而已),今天会把所有的素材上传写道一个方法里供大家参考,关于上传的接口文档我就不粘贴了,直接上代码! /** * 这里说下,在上传视频素材的时候,微信说不超过20M,我试了下,超过10M调通的可能性都比较小,建议大家上传视频素材的大小小于10M比交好 * @param accessToken * @param file 上传的文件 * @param title 上传

wex5 实战 手写签名与上传

之前做过一个物流演示模块,有一个功能没做完,就是收件人收货后,可以手写签名并上传,替代传统纸张的签名.今天终于做完了. 一 效果演示: 后台图片上传成功 二 设计思路: 运用canvas插件jq-signature,制作手写签名,并通过二进制流方式上传图片 三 代码实现: 1 .下载引入插件jq-signature 手写签名插件,网上有很多,经过多种插件的逐步尝试,只有插件jq-signature达到了我想要的效果; 原因有二:1,支持手机触摸,web,鼠标.其它有的不支持手机触摸. 2,直接转

微信上传素材返回 '{"errcode":41005,"errmsg":"media data missing"}',php5.6返回

问题描述: php5.5已经把通过@加文件路径上传文件的方式给放入到Deprecated中了.php5.6默认是不支持这种方式了 解决办法curl处理 function curl_post($url, $data, $header = array()){ if(function_exists('curl_init')) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); if(is_array($header) && !emp

微信开发上传素材工具类

/**     * 上传素材     * @author matao     * @date 2016年7月20日     */    public static String uploadMedia(String uploadMediaUrl, MultipartFile file) throws IOException    {        String result = null; HttpURLConnection con = (HttpURLConnection) new URL(u

Fiddler小技巧-测试上传文件接口&多参数并传情况

写了多年的API了,fidder还真是方便至极相对于postman来说. 两种常用方式: 抓包:app通过代理方式,就可以在pc端看到fidder的请求了 因为会监控好多跟我们需要的没关系的HTTP请求, 就要开启过滤了 主动调试API&上传文件参数&其它参数 拷贝点击"upload file"上传之后自动生成的body然后修改: ---------------------------acebdf13572468 Content-Disposition: form-da

struts2+extjs文件上传完整实现(解决了上传中的各种问题)

首先需要引入上传控件 <script type="text/javascript" src="<%=basePath%>/js/ext/examples/ux/fileuploadfield/FileUploadField.js" charset="utf-8"></script> 弹出上传框对应extjs代码 var uploadForm=new Ext.FormPanel({ id:'uploadForm'

记一次文件上传报错解决过程The temporary upload location is not vali

写一个文件上传接口,报了如下错误: Failed to parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [C:\Users\s0661\AppData\Local\Temp\tomcat.7304072307918184638.9997\work\Tomcat\localhost\ROOT] is not vali 这个博客解释得很清楚 

WebAPI实现移动端上传头像接口

测试时可以直接使用PostMan模拟发送请求 /// <summary> /// 手机端上传头像接口 /// </summary> /// <param name="LoginToken"></param> /// <param name="Base64String"></param> /// <returns></returns> [HttpPost] public a