'append' викликається на об'єкті, який не реалізує інтерфейс FormData


87

Я намагаюся завантажити зображення за допомогою jquery та ajax. Але тут сталося дивне. У консолі журналу його показ

Помилка TypeEr: "додавання" викликається для об'єкта, який не реалізує інтерфейс FormData.

Скажіть, будь ласка, що я тут зробив неправильно?

Сценарій JS

var prosrc=$("#pro_pix img").last().attr("src");
$("#logoform").on('change',function(event){
var postData = new FormData(this);
$("#pro_pix img").last().hide();
$("#pro_pix img").first().show();
event.preventDefault();
$.ajax(
    {
        url : "/function/pro_pic_upload.php",
        type: "POST",
        data : postData,
        success:function(data, textStatus, jqXHR)
        {
        $("#pro_pix img").last().show();
        $("#pro_pix img").first().hide();
        $("#pro_pix h6").text(data);
        },
        error: function(jqXHR, textStatus, errorThrown)
        {
            //if fails     
        }
    });
});

Моя розмітка HTML

 <div class="row">
    <!-- left column -->
    <div id="pro_pix" class="col-md-4 col-sm-6 col-xs-12">
      <div class="text-center">
        <img src="template/image/725.GIF" class="avatar img-circle img-thumbnail" style="display:none" alt="avatar">
        <img src="<?php echo $rowuser['profile_logo']; ?>" class="avatar img-circle img-thumbnail" alt="avatar">
        <h6>Upload a different photo...</h6>
        <form role="form" id="logoform" enctype="multipart/form-data">
        <input id="logo" name="logo" type="file" class="text-center center-block well well-sm">
        </form>
      </div>
    </div>

Подивіться на перше відповідне запитання: Як надіслати об’єкти FormData з Ajax-запитами в jQuery? .
Фелікс Клінг,

Відповіді:


184

для того, щоб використовувати дані форми з jquery, вам потрібно встановити правильні параметри

$.ajax({
    url : "/function/pro_pic_upload.php",
    type: "POST",
    data : postData,
    processData: false,
    contentType: false,
    success:function(data, textStatus, jqXHR){
        $("#pro_pix img").last().show();
        $("#pro_pix img").first().hide();
        $("#pro_pix h6").text(data);
    },
    error: function(jqXHR, textStatus, errorThrown){
        //if fails     
    }
});

посилання .ajax

processData (за замовчуванням: true)

Тип: логічний

За замовчуванням дані, передані в параметр даних як об'єкт (технічно, що-небудь, крім рядка), будуть оброблені та перетворені у рядок запиту, що відповідає типовому типу вмісту "application / x-www-form-urlencoded" . Якщо ви хочете надіслати DOMDocument або інші необроблені дані, встановіть для цього параметра значення false.


У мене розгубленість. Ви допоможете мені, будь ласка? припустимо, я хочу надіслати файл і рядок разом з масивом. Припустимо, у моєму сценарії я хочу надіслати файл зображення та рядок із іменем користувача. як це зробити? Чи можна створити json, xml або будь-який інший масив, щоб утримувати файл і рядок разом? Я новачок. може бути, це дурне питання. мені потрібна ваша допомога ..

1
просто викличте метод append об’єкта FormData, щоб додати елементи, тобто:postData.append("name",value);
Патрік Еванс

Примітка щодо складних елементів, таких як об'єкти, тобто:, {cat:"meow",dog:"bark"}спочатку потрібно використовувати JSON.stringify: postData.append("name",JSON.stringify(someObject));і проаналізувати json на кінці сервера
Patrick Evans

1
Не забувайте: cache: false саме зараз у мене виникли проблеми. З цим все виправлено.
Зрі

Дякую, я застряг у цьому питанні протягом останньої години!
user752746

34

Додайте ці два параметри у свій AJAX, щоб вирішити вашу проблему:

processData: false,
contentType: false,

Не забувайте: cache: falseсаме зараз у мене виникли проблеми. З цим все виправлено.
Zri

@Zri, що означає cache: false?
Fatih Mert Doğancan

З документації jQuery: кеш (за замовчуванням: true, false для dataType 'script' і 'jsonp') Тип: Boolean Якщо встановлено значення false, браузер не буде кешувати запитувані сторінки. Примітка: Встановлення кешу в значення false буде коректно працювати лише із запитами HEAD та GET. Це працює, додаючи "_ = {timestamp}" до параметрів GET. Параметр не потрібен для інших типів запитів, за винятком IE8, коли POST робиться за URL-адресою, яку вже запитував GET.
Зрі

1
@Zri Можливо, ви використовуєте GETзапит. cache:falseЧи не буде працювати належним чином для POSTзапиту. Як ви вже згадували у наведеному вище коментарі, він працює лише для запитів HEADта GETзапитів. І FormDataвикористовується для подання даних форми, які мають бути POSTзамість GET. Тому я пропоную вам завжди використовувати POST для надсилання даних форми.
Пощастило


2

Додавання:

processData: false,
contentType: false,

безумовно допоможе з файлом, крім того, якщо ви робите будь-які помилки передачі помилок або повідомлень про успіх назад на сторінку, ви захочете використовувати json, щоб полегшити своє життя.

приклад:

dataType: 'json',

це допоможе розібрати ваші відповіді. Без цього він видасть помилку.


0

Просто відредагуйте свій рядок:

var postData = new FormData(this);

до:

var postData = new FormData($(this));
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.