【发布时间】:2018-11-12 14:20:04
【问题描述】:
我需要有关将文件上传到 Slack 的帮助。
到目前为止,我有一个 Slack-App 正在使用我的代码(如下)。但我能做的就是发消息。我无法将图像附加到消息中 - 因为我不明白如何使用所谓的“方法”,并且 Slack 的语法在他们的 API 页面上“显示”。
这会创建我的“内容”,在它下面只是一个用于读取我可以上传的文件的流:
public class PostMessage
{
public FormUrlEncodedContent Content(string message, string file)
{
var values = new Dictionary<string, string>
{
{"token", "xoxp-myToken"},
{ "username", "X"},
{ "channel", "myChannel"},
{ "as_user", "false"},
{"text", message},
{ "content", file},
{ "attachments","[{ \"fallback\":\"dummy\", \"text\":\"this is a waste of time\"}]"}
};
var content = new FormUrlEncodedContent(values);
return content;
}
}
public class PostFile
{
String path = @"C:\Users\f.held\Desktop\Held-Docs\dagged.jpg";
public string ReadImageFile()
{
FileInfo fileInfo = new FileInfo(path);
long imageFileLength = fileInfo.Length;
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs);
byte[] imageData = br.ReadBytes((int)imageFileLength);
var str = Encoding.Default.GetString(imageData);
return str;
}
}
}
通信的客户端:
public class SlackClient
{
private readonly Uri _webhookUrl;
private readonly HttpClient _httpClient = new HttpClient {};
public SlackClient(Uri webhookUrl)
{
_webhookUrl = webhookUrl;
}
public async Task<HttpResponseMessage> SendMessageAsync(FormUrlEncodedContent content)
{
var response = await _httpClient.PostAsync(_webhookUrl, content);
return response;
}
}
}
主要:
public static void Main(string[] args)
{
Task.WaitAll(IntegrateWithSlackAsync());
}
private static async Task IntegrateWithSlackAsync()
{
var webhookUrl = new Uri("https://slack.com/api/files.upload");
var slackClient = new SlackClient(webhookUrl);
PostMessage PM = new PostMessage();
PostFile PF = new PostFile();
while (true)
{
Console.Write("Type a message: ");
var message = Console.ReadLine();
var testFile = PF.ReadImageFile();
FormUrlEncodedContent payload = PM.Content(message, testFile);
var response = await slackClient.SendMessageAsync(payload);
var isValid = response.IsSuccessStatusCode ? "valid" : "invalid";
Console.WriteLine($"Received {isValid} response.");
Console.WriteLine(response);
response.Dispose();
}
}
} }
如果有人有上传的示例。甚至更好,
如果有人真的可以解释这些 Slack-Messages 必须具有的语法。
那太好了!我仍然不知道我应该在哪里以及如何放置所谓的 “接受的内容类型:multipart/form-data, application/x-www-form-urlencoded” 到我的上传。我只是找不到这方面的例子......
编辑:
让我感到困惑的是,Slack 声明他们有一个名为file.upload 的额外方法——但我们不应该再使用它,我们应该只使用postMessage。
但是我如何将文件“打包”到消息中?我的语法似乎总是关闭。尤其是在“内容”方面...... 我只是无法弄清楚 c# 代码的外观。我在哪里声明上述“内容类型”?
另一个问题是,它总是通过它发送我的消息 - 意味着我从服务器获得 200 响应。但它从不显示文件(这可能意味着语法已关闭)或者我得到 200 响应但该消息从未在 Slack 中显示。
【问题讨论】:
-
您能否说明您的目标是什么:您想在您的消息中附加图片还是要将文件上传到 Slack?
-
嘿,Erik,我需要两者兼得。但是为什么会有区别呢?一切都是文件,对吧?我知道你在我的另一个问题上发布了我只能发布图片的消息。但是 Slack 明确指出文件上传现在被视为消息(看这里:api.slack.com/changelog/2018-05-file-threads-soon-tread)。还是我读错了?当我使用 SlackRTM 上传任何类型的图像或文件时,它的行为似乎没有什么不同......所以?!谢谢!
-
你是对的。
files.upload现在正在创建消息,但仍然存在差异。文件上传将仅包含文件,并且文件实际上传到 Slack。相反,您可以在消息中包含多个图像以及文本。并且这些图像没有上传。您只需提供一个 URL 即可。 -
这是一个显示文件上传和带有图像附件的消息的屏幕截图:i.imgur.com/w5dgw5s.png
-
好吧...我知道你的意思,但我说的是在我的物理硬盘上上传文件和图像,而不是任何地方都可以在线的东西。而且我必须坚持我的答案,即我想要两者都做:) 上传文件和附有文件的消息。我刚刚测试了我的 FileStream,我的意思是我将它转换回图像并将其写入我的硬盘。它奏效了,所以我的错在我发送的“信息”中的某个地方。或者我实际创建然后编码和发送的对象......但我一无所知。我一直在这个问题上 - 从早上 8 点开始 :(