首页 > 解决方案 > 如何将文件从 .NET-Application 上传到 Rocket.Chat-Channel?

问题描述

我需要在我的 .NET 应用程序中创建一个反馈表单,它将消息发送到 Rocket.Chat-Channel(什么是 Rocket.Chat?)。

我已经能够使用 Rocket.Chat 的 api 发送短信。

我找到了一个文档,如何使用 api 发送文件,但我以前从未这样做过。如何使用我的 Json 发送文件?

以前有人这样做过吗?也许有人可以给我一个小例子来完成这项工作。

这是我的方法的代码,它发送文本消息。

private void SendToRocketChat()
        {
            var baseAddress = "https://plc.ifm-sw.net/api/v1/chat.sendMessage";

            var http = (HttpWebRequest)WebRequest.Create(new Uri(baseAddress));
            http.Method = "POST";
            http.ContentType = "application/json";
            http.Headers.Add("X-Auth-Token", "4ZLqSyN9IEFIkj6SqIde2a4orHhEdL8S0eGPEFdfS9C");
            http.Headers.Add("X-User-Id", "rocket.cat");

            string rid = "F24Ydk2kkTXAPWsQ9";

            JObject Json = new JObject(new JProperty("message", new JObject(new JProperty("rid", rid), new JProperty("msg", WebUtility.HtmlEncode(FeedbackText)))));

            ASCIIEncoding encoding = new ASCIIEncoding();
            Byte[] bytes = encoding.GetBytes(Json.ToString());

            Stream newStream = http.GetRequestStream();
            newStream.Write(bytes, 0, bytes.Length);
            newStream.Close();

            var response = http.GetResponse();

            var stream = response.GetResponseStream();
            var sr = new StreamReader(stream);
            var content = sr.ReadToEnd();
            logger.LogInformation(JsonConvert.DeserializeObject(content).ToString().Trim('{', '}'));
        }

这就是我已经为 Fileupload 尝试过的。我的错误在哪里?

private void SendFileToRocketChat()
        {
            var url = "https://example-sw.net/api/v1/rooms.upload/:gdfgfgdkTXAPWsQ9";
            var filePath = "Abbildung13.jpg";

            var httpClient = (HttpWebRequest)WebRequest.Create(new Uri(url));
            httpClient.Method = "POST";
            httpClient.Headers.Add("X-Auth-Token", "4ZLqSyN9IEhEdLgfd8S0eGPEFdfS9C");
            httpClient.Headers.Add("X-User-Id", "rocket.cat");
            httpClient.ContentType = "multipart/form-data";

            MultipartFormDataContent form = new MultipartFormDataContent();

            FileStream fs = File.OpenRead(filePath);
            var streamContent = new StreamContent(fs);

            var imageContent = new ByteArrayContent(streamContent.ReadAsByteArrayAsync().Result);
            imageContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data");

            imageContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data");

            form.Add(imageContent, "file", Path.GetFileName(filePath));
            form.Add(imageContent, "msg", "This is a message with a file");
            form.Add(imageContent, "description", "Simple text file");

            var response = httpClient.GetResponse();

            var stream = response.GetResponseStream();
            var sr = new StreamReader(stream);
            var content = sr.ReadToEnd();
            logger.LogInformation(JsonConvert.DeserializeObject(content).ToString().Trim('{', '}'));
        }

标签: c#apihttphttpwebrequestrocket.chat

解决方案


一段时间后,我得到了一个代码,它工作正常。也许它会在以后帮助某人。

private void SendFileToRocketChat()
        {
            var url = "https://exampleurl.net/api/v1/rooms.upload/fsgfadgTXAPWsQ9";
            var filePath = "text.zip";
            NameValueCollection formFields = null;
            string boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x");

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.ContentType = "multipart/form-data; boundary=" + boundary;
            request.Method = "POST";
            request.KeepAlive = true;
            request.Headers.Add("X-Auth-Token", "4ZLqSyN9IEgfasgfdagsdg8S0eGPEFdfS9C");
            request.Headers.Add("X-User-Id", "rocket.bot");

            Stream memStream = new System.IO.MemoryStream();
            var boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
            var endBoundaryBytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--");
            string formdataTemplate = "\r\n--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\";\r\n\r\n{1}";

            string files = filePath;
            if (formFields != null)
            {
                foreach (string key in formFields.Keys)
                {
                    string formitem = string.Format(formdataTemplate, key, formFields[key]);
                    byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem);
                    memStream.Write(formitembytes, 0, formitembytes.Length);
                }
            }

            string headerTemplate = "Content-Disposition: form-data; name=\"file\"; filename=\"{1}\"\r\n" + "Content-Type: application/zip\r\n\r\n";
            memStream.Write(boundarybytes, 0, boundarybytes.Length);
            var header = string.Format(headerTemplate, "file", files);
            var headerbytes = System.Text.Encoding.UTF8.GetBytes(header);
            memStream.Write(headerbytes, 0, headerbytes.Length);
            using (var fileStream = new FileStream(files, FileMode.Open, FileAccess.Read))
            {
                var buffer = new byte[1024];
                var bytesRead = 0;
                while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
                {
                    memStream.Write(buffer, 0, bytesRead);
                }
            }

            memStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);
            request.ContentLength = memStream.Length;
            using (Stream requestStream = request.GetRequestStream())
            {
                memStream.Position = 0;
                byte[] tempBuffer = new byte[memStream.Length];
                memStream.Read(tempBuffer, 0, tempBuffer.Length);
                memStream.Close();
                requestStream.Write(tempBuffer, 0, tempBuffer.Length);
            }
            using (var response = request.GetResponse())
            {
                Stream stream2 = response.GetResponseStream();
                StreamReader reader2 = new StreamReader(stream2);
                string res = reader2.ReadToEnd();

                logger.LogInformation(JsonConvert.DeserializeObject(res).ToString().Trim('{', '}'));
            }
        }

推荐阅读