C# 文件上载到rabbitmq
我需要一个.NETAPI端点,在这里我可以通过流将文件发布到RabbitMQ。我已经做了一个端点将文件发布到服务器,如下所示:。我大致了解如何将数据传送到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); 但我不知道如何将文件或流导入频道。有教程吗
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