Мне нужно загрузить файл, используя ядро .net.
Я использую многочастную форму и AJAX.
Однако у меня есть уникальное требование. Мне нужно иметь возможность добавлять данные в сериализованный массив и затем связывать их с контроллером через запрос POST ajax и привязку модели.
Мне нужно добавить идентификатор, который я передаю контроллеру. На основании идентификатора я решаю, к какой строке таблицы я сохраняю данные загруженного файла.
Мой контроллер, на который я отправляю сообщения:
[HttpPost]
public async Task<IActionResult> File(List<IFormFile> files)
{
long size = files.Sum(f => f.Length);
var filePath = Path.GetTempFileName();
foreach (var formFile in files)
{
if (formFile.Length > 0)
{
using (var stream = new FileStream(filePath, FileMode.Create))
{
await formFile.CopyToAsync(stream);
}
}
}
string fpath = filePath;
var query = from d in db.TableA
where d.File == null && d.id == id // This is where I need to compare the ID
select d;
foreach (TableA details in query)
{
details.File = filePath;
}
try
{
await db.SaveChangesAsync(); // await needed to hold execution
}
catch (Exception e)
{
Console.WriteLine(e);
}
return RedirectToAction("View");
}
где d.File == null && d.id == id // Здесь мне нужно сравнить
ID
Форма для нескольких деталей:
<form method="post" id="typea" enctype="multipart/form-data" asp-controller="Main" asp-action="File">
<label class="btn btn-info"> Upload your document <input type="file" name="files" onchange="this.form.submit()" hidden />
</label>
</form>
Мой звонок по Ajax:
$(document).ready(function () {
$('#typea').click(function () {
event.preventDefault();
var $form = $(this);
var serializedData = $form.serializeArray();
serializedData.push({ name: "ID", value: "typea" });
$.ajax({
url: "Main/File",
type: "POST",
data: serializedData
});
});
Моя проблема заключается в следующем:
Если я нажимаю массив, я не могу рассчитывать на интерфейс IFormFile для привязки модели.
Можно ли как-нибудь расширить интерфейс IFormFIle?
Или есть способ, которым я могу сделать это без использования IFormFile.
Я пытался написать собственную модель, ссылающуюся на интерфейс IFormFIle, но не смог.
public interface IFormFile
{
string ContentType { get; }
string ContentDisposition { get; }
IHeaderDictionary Headers { get; }
long Length { get; }
string Name { get; }
string FileName { get; }
Stream OpenReadStream();
void CopyTo(Stream target);
Task CopyToAsync(Stream target, CancellationToken cancellationToken = null);
}
Я не мог использовать методы интерфейса, что очевидно.
Указатели пожалуйста:).