#c# #asp.net-mvc #asp.net-core-webapi #httppostedfilebase
#c# #asp.net-mvc #asp.net-core-webapi #httppostedfilebase
Вопрос:
У меня есть ASP.NET Веб-приложение MVC, используемое в .NET Framework 4.6.
Мне нужно иметь возможность загружать файлы, а затем пересылать их в ASP.NET Ядро 3.1 Веб-API.
Проблема в том, что я не могу понять, как отправлять файлы из клиентского приложения в API.
API принимает запрос следующим образом:
public class ReportUploadRequest
{
public List<IFormFile> Files { get; set; }
public int FolderId { get; set; }
public int BrokerId { get; set; }
}
и ASP.NET Приложение MVC имеет функцию контроллера, которая принимает отправку формы и пытается отправить сообщение в API.
Файлы из формы принимаются в ASP.NET MVC вот так:
HttpPostedFileBase[] Files
Я не могу понять, как преобразовать HttpPostedFileBase[] Files
файлы в List<IFormFile> Files
формат, требуемый веб-API.
Я пытался получить файлы в своем контроллере, используя List<IFormFile> Files
, но Files
при отправке значение равно нулю
Как мне подготовить мою форму для использования в формате, приемлемом для Web API?
Ответ №1:
Я не уверен, что это то, о чем вы просите, но я думаю, что это может быть. Я обнаружил, что до тех пор, пока я могу что-то вводить и извлекать из двоичного файла, я золотой. Это также обеспечивает мне хорошую совместимость с другими языками, такими как C .
Если это не то, что вы спрашиваете.. скажите мне, и я удалю свой ответ.
Это то, что я сделал. Мне специально нужны были двоичные данные, которые должны были быть переданы моему контроллеру и возвращены двоичные данные.
Для моего варианта использования секрет был в application / octet-stream .
[Route("api/[controller]")]
[ApiController]
public class SomeDangController : ControllerBase
{
[HttpPost]
[Produces("application/octet-stream")]
public async Task<Stream> GetBinaryThingy()
{
using (var reader = new StreamReader(HttpContext.Request.Body))
{
using (MemoryStream ms = new MemoryStream())
{
await reader.BaseStream.CopyToAsync(ms);
var buffer = ms.ToArray();
//buffer now holds binary data from the client
}
}
byte[] bytes_return = null //populate your binary return here.
return new MemoryStream(bytes_return);
}
}
И на клиенте.. что-то вроде этого:
public async System.Threading.Tasks.Task<byte[]> PostBinaryStuffAsync(byte[] buffer)
{
ByteArrayContent byteContent = new ByteArrayContent(buffer);
var response = await client.PostAsync(dangServerURL, byteContent);
var responseBytes = await response.Content.ReadAsByteArrayAsync();
return responseBytes;
}
Ответ №2:
Мне нужно иметь возможность загружать файлы, а затем пересылать их в ASP.NET Ядро 3.1 Веб-API.
Для выполнения ваших требований вы можете обратиться к следующему фрагменту кода.
В ASP.NET Действие контроллера MVC
public async Task<ActionResult> UploadFile(HttpPostedFileBase[] files)
{
var formContent = new MultipartFormDataContent();
foreach (var file in files)
{
formContent.Add(new StreamContent(file.InputStream), "files", Path.GetFileName(file.FileName));
}
var myHttpClient = new HttpClient();
var response = await myHttpClient.PostAsync("https://xxxx/xxxx/UploadFile", formContent);
if (response.StatusCode == System.Net.HttpStatusCode.OK)
{
//...
}
В ASP.NET Основной метод действия
public async Task<IActionResult> UploadFile([FromForm]List<IFormFile> files)
{
//...
Результат теста