Отправка файла из ASP.NET Приложение MVC 4.6 к ASP.NET Основной веб-API

#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)
{
    //...
  

Результат теста

введите описание изображения здесь