使用ajax上传文件无法正常工作

时间:2014-04-15 13:35:31

标签: php jquery ajax html5

我正在创建自己的小CMS,需要上传文件和图片。我已经尝试过实现blueimp上传器,但无济于事。

我想通过jquery脚本将formData发送到我的CMS。在PHP代码(接收)中,我检查内容类型,然后想要将文件传递给函数(处理)。在控制台中,我可以看到jquery发送附件,但我在PHP中得到空的$ _POST和$ _FILES数组。

我无法使用GET请求,因为这些请求受我的CMS限制。

以下是我的代码片段:

HTML表单:

<form enctype="multipart/form-data">
    <input type="file" name="import_file" id="import_file" />
    <button id="import_send" value="import">Import</button>
</form>

jquery的:

$(document).ready(function(){
    $('#import_send').on('click', function(e){
        e.preventDefault();
        var data = new FormData();
        data.append($('#import_file')[0].files[0].name, $('#import_file')[0].files[0]);
        $.ajax({
            url: window.location.href,
            data: data,
            processData: false,
            type: 'POST',
            contentType: 'multipart/form-data',
            mimeType: 'multipart/form-data',
            success: function (ret) {
                alert(ret);
            }
        });
    });
});

PHP(接收):

<?php
    function do_control(){
        if ($_SERVER['CONTENT_TYPE']){
            if (strpos($_SERVER['CONTENT_TYPE'], 'multipart/form-data') !== false){
                $in = $_FILES;
                $method = 'on_upload';
                if ($bothandler->get_by_name('upload_bot', true) == true){
                    $bothandler->trigger($method, $in);
                }
            }
        }
    }
?>

PHP(处理):

<?php
    public function on_upload($in){
            if ($in['type'] == 'application/zip'){
                if (!file_exists('../extension/'.$in['name'])){
                    move_uploaded_file($in['tmp_name'], '../extension/'.$in['name']);
                }
            }
            if ($in['type'] == 'image/jpeg' || $in['type'] == 'image/png' || $in['type'] == 'image/bmp' || $in['type'] == 'image/gif'){
                if (!file_exists('../images/'.$in['name'])){
                    move_uploaded_file($in['tmp_name'], '../images/'.$in['name']);
                }
            };
            echo 'loaded';
    }
?>

这是在请求标题中写的:

Accept  */*
Accept-Encoding gzip, deflate
Accept-Language de,en-US;q=0.7,en;q=0.3
Cache-Control   no-cache
Connection  keep-alive
Content-Length  316648
Content-Type    multipart/form-data
Cookie  f23476c1b4331c112ea6010733733bd5=icg8d641nv2e79lm3ce7p39h06; 78fad9eff80cd47c7c23dc899cb72eea=b38c1atf7fbqk4jc29p3bej964; silent_admin_session=b38c1atf7fbqk4jc29p3bej964
DNT 1
Host    www.abc.com
Pragma  no-cache
Referer http://www.abc.com/index.php5
User-Agent  Mozilla/5.0 (Windows NT 6.1; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0
X-Requested-With    XMLHttpRequest

这是帖子中的内容

-----------------------------24138208746564 Content-Disposition: form-data; name="192184_10150119104647532_7869997_o.jpg"; filename="192184_10150119104647532_7869997_o.jpg" Content-Type: image/jpeg
***

PHP脚本抛出错误,因为它没有从$ _FILES获取任何数据,因为它是空的。 如果我尝试上传一个绝对不比允许的upload_max_filesize更大的图像或zip文件,这无关紧要。

作为一个额外的问题,我无法发送大于2M的文件。我已经尝试过包含

php_value upload_max_filesize 40M
php_value post_max_size 42M

在htaccess文件中然后我得到500错误。我还尝试使用user.ini文件

执行此操作
upload_max_filesize=40M
post_max_size=42M

但它似乎没有效果。

2 个答案:

答案 0 :(得分:0)

我开发了自己的文件上传系统,这是我的一段代码,可能对你有帮助

$('#inputFile').on('change', function(e) {
        var $input = $(this);
        var file = e.currentTarget.files[0];
        var data = new FormData();
        data.append('file', file);

        $.ajax({
          type: "POST",
          data: data,
          cache: false,
          contentType: false,
          processData: false,
          url: 'path/to/php/script'
        })
          .done(function() {
            alert('success');
          });
});

答案 1 :(得分:0)

我的ajax电话略有变化。现在它有效。谢谢史蒂夫。

$。AJAX({     url:window.location.href,     数据:数据,     cache:false,     processData:false,     类型:'POST',     contentType:false,     成功:功能(ret){         警报(RET);     } });