C# 文件上载到rabbitmq

C# 文件上载到rabbitmq,c#,.net,rabbitmq,asp.net-core-webapi,C#,.net,Rabbitmq,Asp.net Core Webapi,我需要一个.NETAPI端点,在这里我可以通过流将文件发布到RabbitMQ。我已经做了一个端点将文件发布到服务器,如下所示:。我大致了解如何将数据传送到RabbitMQ: var body = Encoding.UTF8.GetBytes("my message"); channel.BasicPublish(exchange: "", routingKey: "hello", basicProperties: null, body: body); 但我不知道如何将文件或流导入频道。有教程吗

我需要一个.NETAPI端点,在这里我可以通过流将文件发布到RabbitMQ。我已经做了一个端点将文件发布到服务器,如下所示:。我大致了解如何将数据传送到RabbitMQ:

var body = Encoding.UTF8.GetBytes("my message");
channel.BasicPublish(exchange: "", routingKey: "hello", basicProperties: null, body: body);

但我不知道如何将文件或流导入频道。有教程吗,或者你能给我解释一下吗?那太好了。谢谢。

只需从文件中读取字节:

var body = File.ReadAllBytes(@"C:\test.xml");
channel.BasicPublish(exchange: "", routingKey: "hello", basicProperties: null, body: body);
UPD 使用
MultipartMemoryStreamProvider
类获取上载的文件:

    [HttpPost]    
    public async Task Upload()
    {
            var provider = new MultipartMemoryStreamProvider();
            await Request.Content.ReadAsMultipartAsync(provider);

            var file = provider.Contents.FirstOrDefault();

            var body = await file.ReadAsByteArrayAsync();

            channel.BasicPublish(
                exchange: "", 
                routingKey: "hello", 
                basicProperties: null, 
                body: body);
   }

如果上传的文件很小并且适合内存,您可以执行smth。比如:

[HttpPost]
public async Task<IActionResult> UploadFile(IFormFile file)
{
  MemoryStream ms = new MemoryStream(new byte[file.Length]);
  await file.CopyToAsync(ms);

  //here you can send these bytes as a message to Rabbit
  Model.BasicPublish(
    exchangeName,
    routingKey,
    body: ms.ToArray());

  return Ok();
}
[HttpPost]
公共异步任务上载文件(IFormFile)
{
MemoryStream ms=新的MemoryStream(新字节[file.Length]);
等待文件.CopyToAsync(ms);
//在这里,您可以将这些字节作为消息发送给Rabbit
Model.BasicPublish(
交换名称,
路由键,
正文:ToArray女士();
返回Ok();
}

我们讨论的文件有多大?在您的示例主体上有一些二进制数据。看起来你只需要以二进制文件的形式打开你的文件,并将其放在publish as body中,然后当你订阅时,你会得到一条消息。你可以发送字节数组,所以在发送时以字节数组的形式读取文件的内容。请注意,以邮件形式发送文件不是一个好主意。您可以将文件放在公共共享文件夹或其他位置,然后将其名称/位置发布到RabbitMQ队列。同意,通过RabbitMQ发送文件不是一个好主意。我猜(xml)文件的内容很短。但我没有文件位置,我有一个流,或者首先是一个POST Api端点。。。?![HttpPost]公共异步任务PostAsync([FromBody]字符串值){…然后可以从中创建流。那么,如何将输入文件放入正文中以移交给RabbitMQ?您的问题是如何在POST方法中获取上载文件的流?对吗?
[HttpPost]公共异步任务PostAsync([FromBody]字符串值)
{
//get stream或bytes[]here
}
Hi Max,您的代码看起来不错,但是当我尝试通过邮递员加载时,对象文件始终为空。我使用POST Body:form data value:file