Próbuję przesłać obraz za pomocą jQuery i Ajax. Ale tutaj wydarzyła się dziwna rzecz. W konsoli zarejestruj jego wyświetlanie
TypeError: „append” wywołane na obiekcie, który nie implementuje interfejsu FormData.
Proszę, powiedz mi, co tu zrobiłem źle?
Skrypt 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
}
});
});
Moje znaczniki 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>
Odpowiedzi:
aby używać formdata z jquery musisz ustawić odpowiednie opcje
$.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 } });
odniesienie .ajax
źródło
postData.append("name",value);
{cat:"meow",dog:"bark"}
najpierw musisz użyć JSON.stringify:postData.append("name",JSON.stringify(someObject));
i przeanalizować json po stronie serweracache: false
chwilą sprawiło mi to problemy. Po naprawieniu tego wszystkiego.Dodaj te dwa parametry do swojego AJAX, aby rozwiązać problem:
processData: false, contentType: false,
źródło
cache: false
chwilą sprawiło mi to problemy. Po naprawieniu tego wszystkiego.cache: false
?GET
żądania. Niecache:false
będzie działać poprawnie naPOST
żądanie. Jak wspomniałeś w powyższym komentarzu, działa tylko dla żądańHEAD
iGET
. IFormData
służy do przesłania danych formularza, które powinny być aPOST
zamiastGET
. Dlatego radzę zawsze używać POST do przesyłania danych z formularza.Musisz ustawić ten parametr w wywołaniu Ajax:
enctype: 'multipart/form-data'
źródło
Dodanie:
processData: false, contentType: false,
na pewno pomoże z plikiem, poza tym, jeśli wykonujesz jakiekolwiek przekazywanie błędów lub komunikatów o sukcesie z powrotem na stronę, będziesz chciał użyć json, aby ułatwić sobie życie.
przykład:
dataType: 'json',
pomoże to w analizie Twoich odpowiedzi. Bez tego wyrzuci błąd.
źródło
Po prostu edytuj swoją linię:
var postData = new FormData(this);
do:
var postData = new FormData($(this));
źródło