.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);

返回的結果

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM