gpt4 book ai didi

c# - 尝试将文件上传到 slack 时出现 "no_file_data"错误

转载 作者:太空宇宙 更新时间:2023-11-03 12:09:11 27 4
gpt4 key购买 nike

当我尝试通过我的 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
}
}
}
}

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

最佳答案

您的代码中有两个错误:

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

补充意见

  • UploadFile(): 将内容类型设置为multipart/form-data 是错误的。这该内容的正确类型为 image/jpeg。但是,那自动检测正确类型的接缝,所以只需删除行。
  • main():Slack API 将始终返回 OK(http 200,除非出现网络问题),因此您还需要查看 okerror JSON 响应的属性。

这是您的代码的更新版本。我更改了您的 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 是更好的方法,建议用于较大的文件。
  • 不确定为什么在 main 中需要一个无限循环。那些真的不好,应该避免。

也请看看我的新async example for uploading a file到 Slack,我在那里应用了这两个想法。

关于c# - 尝试将文件上传到 slack 时出现 "no_file_data"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53283312/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com