Ключ FormData не проходит

Я использую внешний класс для преобразования объектной переменной в переменную FormData. Проходят все ключи, кроме одного для объекта File.

Вот этот внешний класс: https://github.com/therealparmesh/object-to-formdata

Вот как я создаю объекты и превращаю их в FormData

var _documents = [];

for (var i = 0; i < arrayOfFiles.length; i++) {

  var document = {
     File: arrayOfFiles[i].file.nativeFile,
     DocumentId: arrayOfFiles[i].documentId,
     DocumentType: arrayOfFiles[i].documentName
  };

  _documents.push(document);
}

var uploadedInformation = {
       LoanID: 1452465,
       documents: _documents
};

var options = {
   indices: true,
   nulls: true
};

var a = objectToFormData(uploadedInformation, options);

for (var pair of a.entries()) {
     console.info(pair[0] + ', ' + pair[1]);
}

jQuery.ajaxSettings.traditional = true;
$.ajax({
    async: false,
    cache: false,
    contentType: false,
    processData: false,
    type: 'POST',
    url:  '@Url.Action("UploadFile", "Home")',
    data: a
});

Код для контроллера:


[HttpPost]
        [ActionName("UploadFile")]
        public ActionResult UploadFile(UploadedInformation uploadedInformation)
        {
            _ = Request.Form;
            return View();
        }

Класс UploadedFile:

public class UploadedInformation
    {

        public long LoanID { get; set; }
        public IEnumerable<Document> Documents { get; set; }

    }

Класс документа:

public class Document
{

      public HttpPostedFileBase File { get; set;}
      public string DocumentId { get; set;}
      public string DocumentType { get; set; }
}

Все элементы отлично вяжутся, кроме File. Ключи и значения отладчика браузера:

LoanID, 1452465
documents[0][File], [object File]
documents[0][DocumentId], 1
documents[0][DocumentType], Passport

_=Request.Form также отображает только 3 ключа без documents[0][File]

Обновлять: Я поменял контроллер на

public ActionResult UploadFile(IEnumerable<HttpPostedFileBase> file, IEnumerable<string> documentType, IEnumerable<string>documentId, long loanId){...}

и _=Request.Form по-прежнему ничего не показывает с file, однако список файлов заполнен

Еще одно обновление: Судя по всему, на этот раз элементы файлов отображаются только в _=Request.File

Как отправляется файл? часть [object File] мало что нам говорит, так как это, кажется, просто вывод журнала консоли, поэтому объект не будет выводиться в строку. Можете ли вы получить необработанный HTTP-запрос, который публикуется (при использовании Chrome откройте инструменты разработчика и перейдите в раздел «Сеть»)?

Stevie W 28.05.2019 11:52

@StevieW На вкладке «Данные формы» написано: «Идентификатор займа: 1452465 документов [0] [Файл]: (двоичные) документы [0] [Идентификатор документа]: 1 документ [0] [Тип документа]: паспорт»

Martynas Antipenkovas 28.05.2019 12:09

@StevieW я сделал обновление

Martynas Antipenkovas 28.05.2019 12:30

Если в сетевом запросе отображается имя поля и (двоичный) индикатор, то он отправляется. Пробовали ли вы проверить Request.Files, чтобы убедиться, что входящий запрос зарегистрировал файлы не так, как вы ожидаете?

Stevie W 28.05.2019 14:13

@StevieW Я написал несколько обновлений. Да, похоже, что в Request.File есть ключи, но они все еще не привязаны. Любые идеи, как это исправить?

Martynas Antipenkovas 28.05.2019 14:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
112
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Из-за того, как контроллер обрабатывает части запроса на загрузку файлов, я подозреваю, что вам может потребоваться внести некоторые коррективы в ваш процесс и учесть тот факт, что файлы отделяются от основного объекта.

Я включил некоторые корректировки в ваш код ниже (обратите внимание, это не тестировалось, поэтому вам, возможно, придется немного поэкспериментировать), предполагая, что файлы проходят в том же порядке, что и ваши документы, а затем просто запустите процесс сопоставления перед запуском вашего собственный процесс.

Код для контроллера:


[HttpPost]
        [ActionName("UploadFile")]
        public ActionResult UploadFile(List<HttpPostedFileBase> myFiles, UploadedInformation uploadedInformation)
        {
            for (var i = 0; i <uploadedInformation.Documents.Length; i++)
            {
                uploadedInformation.Documents[i].File = myFiles[i];
            }

            // Do stuff

            return View();
        }

В случае, если порядок файлов не может быть установлен, вы можете добавить имя файла к данным, чтобы облегчить сопоставление на стороне сервера.

Javascript

var _documents = [];

for (var i = 0; i < arrayOfFiles.length; i++) {

  var document = {
     File: arrayOfFiles[i].file.nativeFile,
     FileName: arrayOfFiles[i].file.name,
     DocumentId: arrayOfFiles[i].documentId,
     DocumentType: arrayOfFiles[i].documentName
  };

  _documents.push(document);
}

То есть, по сути, разделить загрузку файла, а затем просто прикрепить его вручную в контроллере по идентификатору или имени файла? Честно говоря, я думал об этом решении, но хотел максимально избежать, потому что, как я вижу, оно создает возможности для ошибок, но я, вероятно, реализую его, если не найду, как это исправить. Спасибо!

Martynas Antipenkovas 28.05.2019 14:38

Да, это почти все. сопоставление объекта HttpPostedFileBase с моделью должно позволить остальной части вашего процесса работать без дальнейших изменений.

Stevie W 28.05.2019 14:54

Да, швы достаточно разумны

Martynas Antipenkovas 28.05.2019 15:12

Другие вопросы по теме