/// <summary> /// 构建附件消息 /// </summary> /// <param name="attachmentInfo">附件信息</param> /// <param name="text">消息</param> /// <returns>聊天消息</returns> public static ChatMessage BuildAttachmentMessage(UploadedAttachmentInfo attachmentInfo, string text = " ") { var message = new ChatMessage(); message.Text = text; message.Ent = new List <EntMessage>(); message.Fmt = new List <FmtMessage>(); //设置附件信息 message.Ent.Add(new EntMessage() { Tp = "EX", Data = new EntData() { Mime = attachmentInfo.Mime, Name = attachmentInfo.FileName, Ref = attachmentInfo.RelativeUrl, Size = int.Parse(attachmentInfo.Size.ToString()), } }); //设置附件说明消息范围 message.Fmt.Add(new FmtMessage() { At = text.Length, Len = 1, Key = 0, }); //格式转换 if (text.Contains("\n")) { for (int i = 0; i < text.Length; i++) { if (text[i] == '\n') { FmtMessage fmt = new FmtMessage() { At = i, Tp = "BR", Len = 1 }; message.Fmt.Add(fmt); } } } return(message); }
/// <summary> /// append a attachment file to chat message /// </summary> /// <param name="attachmentInfo">attachment file information, you can get it with ChatBot.Upload(...)</param> public void AppendAttachment(UploadedAttachmentInfo attachmentInfo) { Message.Fmt.Add(new FmtMessage() { At = Message.Text.Length, Key = Message.Ent.Count, Len = 1, }); Message.Ent.Add(new EntMessage() { Tp = "EX", Data = new EntData() { Mime = attachmentInfo.Mime, Name = attachmentInfo.FileName, Ref = attachmentInfo.RelativeUrl, Size = int.Parse(attachmentInfo.Size.ToString()), }, }); }
/// <summary> /// upload large file as attachment /// </summary> /// <param name="fileName">the file will be uploaded</param> /// <param name="redirectUrl">if upload operation should temp changed</param> /// <returns>uploaded information for send message to user or group</returns> public async Task <UploadedAttachmentInfo> Upload(string fileName, string redirectUrl = "") { if (string.IsNullOrEmpty(token)) { //not login or login failed, disable upload Log("Upload Attachment Error", $"Not login, upload operation disabled..."); return(null); } if (string.IsNullOrEmpty(fileName) || !File.Exists(fileName)) { Log("Upload Attachment Error", $"can not find file:{fileName}"); return(null); } try { var fullFileName = Path.GetFullPath(fileName); var fileInfo = new FileInfo(fullFileName); UploadedAttachmentInfo attachmentInfo = new UploadedAttachmentInfo(); attachmentInfo.FullFileName = fullFileName; attachmentInfo.FileName = fileInfo.Name; attachmentInfo.Size = fileInfo.Length; attachmentInfo.Mime = $"file/{fileInfo.Extension}"; var restClient = new RestClient(apiBaseUrl); RestRequest request; if (string.IsNullOrEmpty(redirectUrl)) { request = new RestRequest(UploadEndpoint, Method.Put); } else { request = new RestRequest(redirectUrl, Method.Put); } request.AddHeader("X-Tinode-APIKey", apiKey); request.AddHeader("X-Tinode-Auth", $"Token {token}"); request.AddBody("id", GetNextTid()); request.AddFile("file", fullFileName); var cancellationTokenSource = new CancellationTokenSource(); var response = await restClient.ExecuteAsync(request, cancellationTokenSource.Token); if (response.StatusCode >= HttpStatusCode.OK && response.StatusCode < HttpStatusCode.BadRequest) { if (response.StatusCode == HttpStatusCode.OK) { var obj = JsonConvert.DeserializeObject <JToken>(response.Content); var code = obj["ctrl"]["code"].ToString(); var url = obj["ctrl"]["params"]["url"].ToString(); attachmentInfo.RelativeUrl = url; Log("Upload Attachment Success", $"Upload file success, File={fullFileName}, RefUrl={url}"); return(attachmentInfo); } else if (response.StatusCode == HttpStatusCode.TemporaryRedirect) { var tmpRedirectUrl = string.Empty; //307,should reupload to the redirect url foreach (var h in response.Headers) { //查找重定向地址 if (h.Name.ToLower() == "location") { tmpRedirectUrl = h.Value.ToString(); break; } } Log("Upload Attachment Redirect", $"redirect upload..."); return(await Upload(fileName, redirectUrl)); } else { Log("Upload Attachment Error", $"Upload failed, Http Code={response.StatusCode}"); return(null); } } else { //Failed Log("Upload Attachment Error", $"Upload failed, Http Code={response.StatusCode}"); return(null); } } catch (Exception e) { //exception occurs Log("Upload Attachment Exception", $"Upload failed, Exception={e.Message}"); return(null); } }