尝试将文件上传到松弛时出现“ no_file_data”错误

时间:2018-11-13 14:33:18

标签: c# slack-api

当我尝试通过SlackApp(通过使用HttpClient的C#通过上传)上传文件的任何绑架时, 我一直得到以下回应:

{"ok":false,"error":"no_file_data"}

我检查了ByteArray(我将文件流式传输到数组,然后尝试上传),然后将数据写回到.txt和.jpg中-我尝试了两种类型的数据。当我将它们写回时,它们是原始副本的精确副本,因此我猜我的流式传输和写入ByteArray的工作正常。但是我的上传有些问题。

我将向您展示我的代码: 客户端和上传方法:

using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.Net.Http.Headers;


namespace SlackApp
{
    public class SlackClient
    {
        private readonly Uri _webhookUrl;
        private readonly HttpClient _httpClient = new HttpClient {};

        public SlackClient(Uri webhookUrl)
        {
            _webhookUrl = webhookUrl;
        }

        public async Task<HttpResponseMessage> UploadFile(byte[] file)
        {
            var requestContent = new MultipartFormDataContent();
            var fileContent = new ByteArrayContent(file);
            fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data");
            requestContent.Add(fileContent, "slack", "slack.txt");

            var response = await _httpClient.PostAsync(_webhookUrl, requestContent);
            return response;
        }
    }
}

字节数组的创建:

public class PostFile
{
    String path = @"C:\Users\f.held\Desktop\Held-Docs\dagged.jpg";

    public byte[] ReadImageFile()
    {            
        FileInfo fileInfo = new FileInfo(path);
        long imageFileLength = fileInfo.Length;
        FileStream fs = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);
        BinaryReader br = new BinaryReader(fs);
        byte[] imageData = br.ReadBytes((int)imageFileLength);
        return imageData;
    }
}

主要:

using System;
using System.Net.Http;
using System.Threading.Tasks;


namespace SlackApp
{
    class TestArea
    {
        public static void Main(string[] args)
        {    
            Task.WaitAll(IntegrateWithSlackAsync());
        }

        private static async Task IntegrateWithSlackAsync()
        {
            var webhookUrl = new Uri("https://slack.com/api/files.upload?token=xoxp-hereStandsMyToken&channel=MyChannel");  
            var slackClient = new SlackClient(webhookUrl);
            PostMessage PM = new PostMessage();
            PostFile PF = new PostFile();
            var testFile = PF.ReadImageFile();

            while (true)
            {
                var message = Console.ReadLine(); 
                FormUrlEncodedContent payload = PM.Content(message, "");
                var response = await slackClient.SendMessageAsync(payload);

                string content = await response.Content.ReadAsStringAsync();
                Console.WriteLine(content); //I build these two lines in here so I got the response from the method, and this is where it says "no_file_data"

                var isValid = response.IsSuccessStatusCode ? "valid" : "invalid";
                Console.WriteLine($"Received {isValid} response.");
                Console.WriteLine(response); //this puts out a "valid" response - oddly enough
            }
        }
    }
    }

有人知道这里有什么问题吗?为什么不获取数据?

2 个答案:

答案 0 :(得分:1)

您的代码中有两个错误:

  • main():用于指定通道的参数称为 channels,而不是channel
  • UploadFile():将文件内容添加到多部分时, 需要为文件file包含正确的API参数, 不是slack。并且还希望包含一个合理的文件名(而不是slack.txt)。

其他评论

  • UploadFile():将内容类型设置为multipart/form-data是错误的。的 该内容的正确类型为image/jpeg。然而 正确的类型接缝以自动检测,因此只需移除 线。
  • main():Slack API将始终返回OK(http 200,除非存在网络问题),因此您还希望查看JSON响应的okerror属性代替。

这是您代码的更新版本。我更改了您的main()方法,以包含对`UploadFile()?的调用。

using System;
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;


namespace SlackApp
{
    public class PostFile
    {
        string path = @"C:\Users\Stratios_down.jpg";

        public byte[] ReadImageFile()
        {
            FileInfo fileInfo = new FileInfo(path);
            long imageFileLength = fileInfo.Length;
            FileStream fs = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);
            BinaryReader br = new BinaryReader(fs);
            byte[] imageData = br.ReadBytes((int)imageFileLength);
            return imageData;
        }
    }

    public class SlackClient
    {
        private readonly Uri _webhookUrl;
        private readonly HttpClient _httpClient = new HttpClient { };

        public SlackClient(Uri webhookUrl)
        {
            _webhookUrl = webhookUrl;
        }

        public async Task<HttpResponseMessage> UploadFile(byte[] file)
        {
            var requestContent = new MultipartFormDataContent();
            var fileContent = new ByteArrayContent(file);            
            requestContent.Add(fileContent, "file", "stratios.jpg");

            var response = await _httpClient.PostAsync(_webhookUrl, requestContent);
            return response;
        }
    }

    class TestArea
    {
        public static void Main(string[] args)
        {
            Task.WaitAll(IntegrateWithSlackAsync());
        }

        private static async Task IntegrateWithSlackAsync()
        {
            var webhookUrl = new Uri(
                "https://slack.com/api/files.upload?token=xoxp-MY-TOKEN&channels=test"
            );
            var slackClient = new SlackClient(webhookUrl);

            PostFile PF = new PostFile();
            var testFile = PF.ReadImageFile();

            var response = await slackClient.UploadFile(testFile);

            string content = await response.Content.ReadAsStringAsync();
            Console.WriteLine(content);
            Console.ReadKey();

        }
    }
}

此外,我将提供一些建议来改进您的代码。

  • 我没有在URL中包括其他API参数,而是 会按照API的建议在POST请求中发送它们 文档。
  • 将文件包含为FileStream而不是自己将其加载到 ByteArray是更好的方法,建议用于较大的文件。
  • 不确定为什么您的主体中需要无限循环。那些真的 不好,应该避免。

也请看看我对Slack的新async example for uploading a file在其中应用了这两个想法。

答案 1 :(得分:0)

我也遇到了no_file_data错误。我发现您该文件需要存在并且里面需要实际内容。上传之前,请确保除了文件存在以外,还要进行大小检查或内容长度检查

相关问题