0

私はAjaxで写真をアップロードしようとしましたが、Opera(My Standard Browser)で問題なく動作するコードを記述しました。今、私は他のブラウザでそれをテストしました、それらはすべてエラーで戻って撃ちます。私のPHPスクリプトは

if(!empty($_FILES)) {
    //todo
} else {
    exit();
}

var_dump($_FILES); die();だから私は何が悪いのかを見るために最初に入れようとしました。それらはすべてこれを返しarray(0) {}ます。FireFox、Chrome、Safari(すべて最新バージョン)、win7のIE9、Debianの最新のFirefoxでテストしました。最大の問題は、なぜそれが機能しないのか理解できません。開発者ツールと上記のすべてのブラウザーで、正しい名前のファイルを正しい位置に表示できるからです。

アップロードするJSは次のとおりです。

var photo_input1 = document.createElement('input');

photo_input1.setAttribute('type','file');
photo_input1.setAttribute('class','photo_input');
photo_input1.setAttribute('id','photo1');
photo_input1.addEventListener('change', function() {
    upload_photo(this.id,this.files[0])
});

var upload_photo = function(filename,file) {
    var data_arr = Array();
    data_arr['callback_name'] = 'upload_photo';
    upload_file(filename,file,'add_photo.php',data_arr);
}

var upload_file = function(filename,file,url,data_arr) {
    var datapack = null;
    var ajaxanswer = function() {
        try {
            if (ajax.readyState == 4) {
                if (ajax.status == 200) {
                    //todo
                } else {
                    alert('Problems:' + "\n" + ajax.statusText);
                }
            }
        } catch(e) {
        }
    }

    try {
        var ajax = new XMLHttpRequest();
    } catch(e) {
        try {
            var ajax = new ActiveXObject("Msxml2.XMLHTTP");
        } catch(e) {
            try {
                var ajax = new ActiveXObject("Microsoft.XMLHTTP");
            } catch(e) {
                return false;
            }
        }
    }

    if(ajax) {
        if(typeof url != 'undefined') {
            datapack = new FormData;
            datapack.append(filename,file);
            if(typeof data_arr != 'undefined') {
                for(key in data_arr) {
                    datapack.append(key, data_arr[key]);
                }
            }
            ajax.open('POST',url, true);
            ajax.setRequestHeader('Content-type', 'multipart/form-data');
            ajax.onreadystatechange = ajaxanswer;
            ajax.send(datapack);
        }
    }
}
4

2 に答える 2

1

ajaxを使用してファイルをアップロードすることはできません。通常の方法は、iframe内部を使用し、iframeを使用してフォームを送信することです。あなたはここで方法の1つについて読むことができます。

また、あなたはこの答えを読むことができます。

XHR2では、AJAXを介したファイルのアップロードがサポートされています。たとえば、FormDataオブジェクトを使用しますが、残念ながら、すべての/古いブラウザではサポートされていません。

于 2013-01-25T15:32:02.823 に答える
0

FormDataは、他の比較的新しいブラウザと同様にOpera v12以降でのみ機能します:http://caniuse.com/#search=FormData

これをAjaxのようなファイルアップロードに試すことができます:https ://github.com/valums/file-uploader 。Arun P Johnyが述べたように、Ajaxでのアップロードはありませんが、この場合は非表示のiframeなど、いくつかの回避策を使用できます。

于 2013-01-25T15:32:38.627 に答える