POST-запрос с составными / form-данными из формы ExtJS в .Контроллер Net5 получает пустой responseText

#json #extjs #controller

#json #extjs #контроллер

Вопрос:

У меня есть форма в ExtJS:

 {
        xtype: 'form',
        items: [{        
            xtype: 'filefield',
            name: 'azezFile'  
        }],
        buttons: [{
            text: 'Load',
            handler: function() {
                var form = this.up('form').getForm();      
                if(form.isValid()) { 
                    form.submit({
                        url: uploadApiPath,   
                        success: function(fp, o) {
                           // Never goes here
}
});
...
 

Он отправляет файл на контроллер (.Net5):

 namespace KROSS_Core.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    [Produces("application/json")]
    public class UploadController : ControllerBase
    {                    
        // POST: api/Upload
        [HttpPost]
        public IActionResult Post([FromForm] IFormFile file)
        {
            //AzezUploadFile(this.HttpContext);
            return Ok(new { success = true });
            //return Ok(LoadFileToBase(this.HttpContext));
            //return BadRequest(new { success = false, message = "Wrong answer" });
        }
 

Контроллер получает запрос и ответы нормально, но я получил исключение в ext-all-debug.js:

Необработанное исключение в строке 6092, столбец 17 в https: // localhost:44364/Website/Scripts/ext.js/ext-all-debug.js 0x800a139e — Ошибка JavaScript: Ext.JSON.decode(): вы пытаетесь декодировать недопустимую строку JSON:

И response.responseText пуст в отладчике. После того, как я закрываю это исключение, браузер (IE11) просит меня сохранить или открыть этот файл json. Firefox показывает другую ошибку в консоли:

 "You're trying to decode an invalid JSON String: <pre>{"success":true}</pre>"
 

, но он был установлен [Производит («application / json»)] в контроллере…

Журнал Google Chrome: "You're trying to decode an invalid JSON String: <pre style="word-wrap: break-word; white-space: pre-wrap;">{"success":true}</pre>"

В чем проблема и как заставить ее работать? Тот же метод контроллера, загруженный без отправки составных данных формы, проходит нормально, и ExtJS работает с response JSON.

Комментарии:

1. вы пробовали использовать type Object и обычный возврат вместо IActionResult и Ok ?

2. {» <- Ваш JSON неверен, в вашем JSON есть escape-символы (обратная косая черта).

3. @FabioBarros Я попробовал это в первую очередь и теперь попробовал снова, но результат тот же — пустой reponseText

4. @ArthurRubens как вы можете видеть, я не сериализую его сам, это делает .Net5, поэтому он делает действительно правильный JSON, я всегда получаю правильный результат JSON, выполняя тот же запрос, но без отправки файла в виде данных

5. похоже, что в ответе при передаче объекта в json не используются двойные кавычки, возможно, вы могли бы попытаться изменить ответ на string и вернуть обычный текст «{‘success’ = false}»

Ответ №1:

Я понятия не имею, как это исправить в ExtJS, но я использовал другой метод загрузки файла на сервер (тот же контроллер), и он работает идеально:

 function uploadFile(file, url, success, failure) {
    var formData = new FormData();
    var request = new XMLHttpRequest();

    formData.append('file', file);

    request.onload = function (response) {
        var jsonResult = JSON.parse(response.target.responseText);

        if (jsonResult.exception || jsonResult.error) {
            failure(jsonResult);
        }
        else {
            success(jsonResult);
        }
    };

    request.open("POST", url);
    request.send(formData);
}
 

И используйте его как

 uploadFile(form.down('[name=fileInnputName]').extractFileInput().files[0], uploadApiPath, function() { }, function() { });