Добрый день!
Я работаю над проектом ASP.NET Web API 2. В определенный момент необходимо загрузить некоторые файлы. Файлы должны быть связаны с определенным FileModel (нашим собственным классом). Таким образом, клиенту необходимо отправить IEnumerable в качестве параметра, а файлы - как содержимое. Поскольку это RESTful API, оба должны быть отправлены с тем же запросом.
Самое лучшее, что мы могли бы придумать, - это следующее действие контроллера:
public async Task<HttpResponseMessage> Add([FromUri] IEnumerable<FileModel> fileModels)
{
// REQUEST INTEGRITY TESTING
var streamProvider = new CustomMultipartFormDataStreamProvider(fileSavePath, fileModels);
// Read the MIME multipart content using the stream provider we just created.
var work = await Request.Content.ReadAsMultipartAsync(streamProvider).ContinueWith(async t =>
{
// SOME WORK DONE AFTER SAVING THE FILES TO THE HARD DRIVE
}
}
Проблема следующая: файлы загружаются с помощью заголовка Content-Type "multipart/form-data". Нам нужно знать содержимое FileModels, прежде чем обращаться с файлами на стороне сервера. Если мы используем MultipartFormDataStreamProvider, мы можем получить доступ только к параметрам non file после того, как файлы уже сохранены на жестком диске.
Единственным обходным решением для этого, которое мы могли найти, является отправка IEnumerable <FileModel> в URL. Но учитывая, что URL-адрес имеет ограниченную максимальную длину, это не является надежным методом.
Вопрос: есть ли способ отправить оба IEnumerable <FileModel> fileModels и файлы в теле запроса и получить доступ к параметру fileModels перед доступом к файлам? Мы также хотим использовать HttpContext.Current.Request.Files.Count;
Наш текущий jQuery для загрузки файлов выглядит так (для ранних целей тестирования он поддерживает только одну загрузку файла):
$('#Upload').click(function(e) {
e.preventDefault();
var headers = new Array();
headers["SessionId"] = sessionId;
var files = $('#fileInput').get(0).files;
var formData = new FormData();
formData.append("files", files[0]);
var fileModel = $('#fileSubmission').serialize();
$.ajax({
url: "api/Submissions/Add/?" + fileModel,
headers: headers,
type: 'POST',
data: formData,
cache: false,
contentType: false,
processData: false,
dataType: 'json'
});
});
Большое спасибо!