У меня есть 2 ApiController, которые реализуют один и тот же код. Единственная разница - ProcessFile
[System.Web.Http.Route("api/locationgroup/upload")]
[System.Web.Http.HttpPost]
public async Task<ImportModel> PostFile()
{
ImportModel _importmodel = new ImportModel();
StringBuilder sb = new StringBuilder();
// Check if the request contains multipart/form-data.
if (!Request.Content.IsMimeMultipartContent())
{
// throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
Status multipartstatus = new Status();
multipartstatus.StatusCode = (int)HttpStatusCode.UnsupportedMediaType;
multipartstatus.Success = false;
multipartstatus.StatusDescription = "UnsupportedMediaType";
_importmodel.Statuses.Add(multipartstatus);
}
string root = HttpContext.Current.Server.MapPath("~/uploads");
var provider = new MultipartFormDataStreamProvider(root);
string newfilename = string.Empty;
// Read the form data and return an async task.
//await Request.Content.ReadAsMultipartAsync(provider);
await Request.Content.ReadAsMultipartAsync(provider).ContinueWith<ImportModel>(o =>
{
foreach (var key in provider.FormData.AllKeys)
{
foreach (var val in provider.FormData.GetValues(key))
{
sb.Append(string.Format("{0}: {1}\n", key, val));
}
}
foreach (MultipartFileData file in provider.FileData)
{
string filename = file.Headers.ContentDisposition.FileName.Replace("\"", "");
FileInfo fileInfo = new FileInfo(file.LocalFileName);
newfilename = fileInfo.DirectoryName + "\\" + filename;
}
_importmodel.DebugInfo = sb.ToString();
_importmodel.Filename = newfilename;
return _importmodel;
});
if (!string.IsNullOrWhiteSpace(_importmodel.Filename))
{
ProcessFile(_importmodel.Filename);
}
return _importmodel;
}
Проблема, с которой я столкнулся, заключается в том, что один контроллер, который получает файл * .xslx, работает, а другой контроллер, который получает файл *. xml, - нет. Код javascript одинаков для обоих.
Ниже приведена функция, которую я вызываю
function CallPostUploadRestAPI(url, data, callbacksuccess, callbackerror) {
$.ajax({
url: url,
data: data,
cache: false,
processData: false,
contentType: false,
method: 'POST',
type: 'POST', // For jQuery < 1.9
error: callbackerror,
success: callbacksuccess
});
}
Ниже моя реализация
let formData = new FormData();
let importid=25;
if (fileInputElement.files[0] != undefined) {
formData.append("importid", importid);
formData.append("userfile", fileInputElement.files[0]);
for (var key of formData.entries()) {
console.log(key[0] + ', ' + key[1]);
}
jQuery.each(jQuery('#iUpload')[0].files, function (i, file) {
formData.append('file-' + i, file);
});
CallPostUploadRestAPI(uri + "/api/multum/upload", formData, function (data) {}, function(){});
}
FormData не пуста, когда Я регистрирую его из javascript
![enter image description here](https://i.stack.imgur.com/8csmt.png)
Но когда я отлаживаю поставщик Api, FormData пуста
![enter image description here](https://i.stack.imgur.com/dtZzf.png)
Единственное различие, которое у меня есть, - это принятие во входном теге
Ниже приведено * .xlsx, которое работает
<input type='file' class='form-control-file' name='iUpload' id='iUpload' accept='.csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel' >
Ниже приведено *. xml, который не работает
<input type='file' class='form-control-file' name='iUpload' id='iUpload' accept='.xml,text/xml,application/xml' >
Еще я подозреваю, что XML не двоичный, а файл Excel - но не уверен.
ОБНОВЛЕНИЕ:
Хорошо, просто изменил accept на PNG, и похоже, что это не совсем нравится XML.