Web API загрузка файла в папку
Доброго времени суток! Что есть: контроллер API с методом, который принимает файл, который загружаю через Postman в form-data прикрепляю файл. Проблема: в контроллер проваливается, но файла нет. Пробовал писать в параметрах метода IFormFile, но в этом случае в метод вообще не попадает а возвращается пустота. Мой код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Impulse_Back_end.Models;
using Impulse_Back_end.Data;
using System.IO;
using System.Net.Http.Headers;
using Impulse_Back_end.Core.Interfaces;
namespace Impulse_Back_end.Controllers {
[ApiController, Route("api/data/upload")]
public class FileUploadController : Controller {
ApplicationDbContext db;
public FileUploadController(ApplicationDbContext _context) {
db = _context;
}
[HttpPost, DisableRequestSizeLimit, Route("file")]
public IActionResult Upload() {
try {
var file = Request.Form.Files[0];
var folderName = Path.Combine("wwwroot", "images");
var pathToSave = Path.Combine(Directory.GetCurrentDirectory(), folderName);
if (file.Length > 0) {
var fileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim('"');
var fullPath = Path.Combine(pathToSave, fileName);
var dbPath = Path.Combine(folderName, fileName);
using (var stream = new FileStream(fullPath, FileMode.Create)) {
file.CopyTo(stream);
}
return Ok(new { dbPath });
}
else {
return BadRequest();
}
}
catch (Exception ex) {
return StatusCode(500, $"Internal server error: {ex}");
}
}
}
}
Ответы (1 шт):
Пример простейшего метода загрузки без проверок и прочего
[HttpPost, DisableRequestSizeLimit, Route("file")]
public IActionResult Post(IFormFile file)
{
using(var fstream = new FileInfo(file.FileName).Create())
{
file.CopyTo(fstream);
return Ok();
}
}
А теперь следим за руками в Postman:
Имя параметра типа IFormFile (в примере - file) и значение поля KEY у записи с загружаемым фалом (обведено на картинке) обязаны совпадать, если эти значения отличаются, вы получите null в контроллере вместо потока загружаемого файла.
От себя добавлю, что для ручного тестирования я предпочитаю использовать Swagger, он несколько удобнее, т.к. генерирует корректные запросы самостоятельно, на основе параметров ваших контроллеров.

