#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() { });