. net core Невозможно десериализовать текущий массив JSON в тип 'Microsoft.AspNetCore.Http.IFormFile' - PullRequest
1 голос
/ 09 июля 2020

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

Невозможно десериализовать текущий JSON в тип «Microsoft.AspNetCore.Http.IFormFile», поскольку для правильной десериализации типу требуется объект JSON. Чтобы исправить эту ошибку, либо измените JSON на объект JSON (например, {"name": "value"}), либо измените десериализованный тип на массив или тип, реализующий интерфейс коллекции (например, ICollection, IList) например List, который можно десериализовать из массива JSON. JsonArrayAttribute также может быть добавлен к типу, чтобы заставить его десериализоваться из массива JSON. Путь 'file', строка 1, позиция 339. "

    [HttpPost("add")]
    public async Task<IActionResult> Add(Post post, IFormFile file){............}

это мой топор ios запрос

  const submit = useCallback(
    async (values: PostExtensions) => {
      debugger;
      setLoading(true);

      const tarih = dayjs(values.date);
      values.tarih = dayjs(date, "YYYY-MM-DDTHH:mm:ss Z").format();

      const formdata = new FormData();
      formdata.append("postId", values.postId!);
      formdata.append("file", values.file![0]);
      formdata.append("userId", values.userId!);
      formdata.append("projectId", values.projectId!);
      formdata.append("date", values.date!);

      await entitySubmit({
        values: JSON.parse(JSON.stringify(values)),
        dispatch: dispatch,
        returndata: true,
        headers: {
          "Content-Type": "multipart/form-data"
        },
        links: [
          {
            type: 0,
            link: "post/addpost",
            actionType: ActionType.add_Post,
            method: "POST",
          },
          {
            type: 1,
            link: "post/editpost",
            actionType: ActionType.edit_Post,
            method: "POST",
          },
        ],
        id: "postId",
      });
      return null;
    },
    [show, dispatch]
  );

когда я пытался опубликовать данные формы, он делает 'nt submit.

EDIT 1 : Я обнаружил проблему, где formData отправляет объект нулевого файла примерно так

formdata.get('file') // '[Object object]'

1 Ответ

0 голосов
/ 09 июля 2020

Не прямой ответ на ваш вопрос, но я обнаружил, что отправка файлов через ajax часто намного проще при использовании кодировки base64. Вот небольшой пример того, как вы можете этого добиться:

//client side
//this function converts a file object to a base64 string
const toBase64 = file => new Promise((resolve, reject) => {
   const reader = new FileReader();
   reader.readAsDataURL(file);
   reader.onload = () => resolve(reader.result);
   reader.onerror = error => reject(error);
});

document.getElementById("upload").onclick = async () => {
    const file = document.getElementById('myfile').files[0];
    const base64 = await toBase64(file);
    const response = await fetch('/home/upload', {
        method: 'post',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify( {base64 /*add any additional values you need here */})
})
    const json = await response.json();
}

//server side
public class UploadData
{
    public string Base64Data { get; set; }
    //any additional properties you need here....
}

[HttpPost]
public IActionResult Upload([FromBody]UploadData data)
{
    var base64 = data.Base64Data.Substring(data.Base64Data.IndexOf(",") + 1); //bit of a hack, need to remove the additional part of the base64 string that JS generates but that .net doesn't like
    var bytes = Convert.FromBase64String(base64);
    //bytes is now available to do whatever you need with
    return Json(someObjectYouWantToReturn);
}

Надеюсь, этот код будет достаточно хорошей отправной точкой, чтобы добраться туда, где вам нужно. Опять же, base64 может быть не тем, что вам нужно, но я часто использую этот подход, я считаю, что с ним легко иметь дело лично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...