Провайдер WebApi пуст - PullRequest
0 голосов
/ 08 мая 2020

У меня есть 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

Но когда я отлаживаю поставщик Api, FormData пуста

enter image description here

Единственное различие, которое у меня есть, - это принятие во входном теге

Ниже приведено * .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.

...