#javascript #c#
#javascript #c#
Вопрос:
У меня есть эта html-форма, в которой я хочу размещать данные и файлы в C # Web Api. Вот мой интерфейсный код
document.getElementById("form1").addEventListener("submit", function (e) {
e.preventDefault();
var input = document.getElementById('files');
var files = input.files;
var formData = new FormData();
for (var i = 0; i != files.length; i ) {
formData.append("files", files[i]);
}
var tags = $('#tags').val();
formData.append("tags", tags);
$.ajax(
{
url: "https://localhost:44371/api/file/upload",
processData: false,
contentType: false,
type: "POST",
data: formData,
dataType: 'json',
success: function () {
alert("Files Uploaded!");
}
}
);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form id="form1">
<div class="form-group">
<div class="buttons">
<div class="upload-button">
<input id="files" name="files" type="file" size="1" />
</div>
</div>
</div>
<div class="form-group">
<label for="tags">Tags:</label>
<input type="text" class="form-control" id="tags">
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary" id="btnSave">Upload and Save</button>
</div>
</form>
И вот мой внутренний код C # для веб-Api:
[HttpPost]
[Route("upload")]
public async Task<ActionResult<FileDocument>> PostFileDocument(List<IFormFile> files, string tags)
{
return Ok("test");
}
Я могу использовать этот метод, и я вижу files
, что у него есть данные. Но tags
отображается значение null. Но я добавил tags
в formData.append("tags", tags);
. Я погуглил, и некоторые сказали, [FromBody] List<IFormFile> files
что я пробовал, но когда я это сделал, он стал нулевым.
Ответ №1:
Я читал, но не пробовал сам, что это работает путем создания класса, который будет использоваться в качестве параметра PostFileDocument()
. Этот класс будет иметь массив IFormFile
и свойство string для тегов, как в
class SomeController
{
[HttpPost]
[Route("upload")]
public async Task<ActionResult<FileDocument>> PostFileDocument([FromForm]Payload payload)
{
// some nice code here
}
}
class Payload
{
// You probably have to align the naming of what you `append()`
// to the `FormData` in JavaScript (e.g. `formData.append("Files", ...)`
// instead of `formData.append("files", ...)`).
public IFormFile[] Files {get;set;}
public string Tags {get;set;}
}
Это описано здесь: https://thomaslevesque.com/2018/09/04/handling-multipart-requests-with-json-and-file-uploads-in-asp-net-core/
Комментарии:
1. Подойдет любой тип коллекции для
files
— это не обязательно должен быть массив. JS просто нужно добавить к каждомуFormData
ключу префиксpayload.
для его привязки (напримерpayload.files
). В качестве альтернативы, просто использование[FromForm] string tags
также будет работать.