最近一個項目需要在釘釘中導出excel。釘釘的文件導出都是工作通知的形式導出。工作通知只能附帶媒體文件(media,釘釘自定義的說法),所以采取的策略是先在服務端生成要導出的excel文件,在通過釘釘上傳媒體文件接口生成媒體文件,然后通過釘釘的工作通知下發給用戶。中間被上傳媒體文件接口卡了半天,記錄一下,也希望能幫助到遇到相同問題的同行。最后吐槽下釘釘的文檔寫的是真的簡略。
回到正題,首先來看釘釘的文檔。
對數據格式和文件名稱都有要求。這個media參數是重點。
最開始的時候是直接用的php的curl做post請求,代碼如下,其中'Content-Type: application/json; charset=utf-8'設置為了multipart/form-data;,$data就是上面的media,但是釘釘的接口返回提示是參數類型不符合要求。
這就讓人納悶了。在網上查詢了下,貌似釘釘的意思是要手動拼接form-data數據,然后傳給他。在網上看了下各種寫法,最后翻了下sdk的源碼,找到上傳文件的地方,研究了下,根據sdk的源碼稍微微調了下,最后成功把文件上傳到釘釘了。
下面這張圖里面的$delimiter變量是分割符,$file是文件,用file_get_contents讀取。
從上面的圖可以看到是有個專門的函數拼接數據的,這就是這次的重點。放下面
sdk里面是寫了多參數的循環處理,我這只用上傳圖片就給簡化了,只寫了一個文件上傳,現在可以看到,為啥釘釘會說你參數類型不對了,因為人家根本就不讀你的header頭。name=media ,filename就是你要上傳的文件。
拼接完后按照正常的curl發出個post請求,搞定。
文件上傳的post請求也貼下,還是給設置了header頭。