【问题标题】:Ajax Upload with JQuery and PHP使用 JQuery 和 PHP 进行 Ajax 上传
【发布时间】:2013-07-07 01:07:03
【问题描述】:

我在使用 Jquery 和 PHP 上传 Ajax 时遇到问题。虽然有很多 * 帖子讨论同一主题,但我没有找到与我的情况相符的帖子。

HTML:

<form action="uploadrecord.php" id="upload_record_form" method="post" enctype="multipart/form-data">
               <div id="upload_record_form_result"></div>
                <ul>
                    <li><input type="file" name="uploadrecord" id="uploadrecord"/></li>
                </ul>
                 <progress></progress>
            </form>

        </div>

Javascript:

 $('#uploadrecord').live('change', function(event) {

        var formData = new FormData($('#upload_record_form')[0]);

        $.ajax({
            url: $('#upload_record_form').attr('action'),
            type: 'POST',
            enctype: 'multipart/form-data',
            xhr: function() {  
                myXhr = $.ajaxSettings.xhr();
                if (myXhr.upload) { 
                    myXhr.upload.addEventListener('progress', progressHandlingFunction, false); 
                }
                return myXhr;
            },

            success: completeHandler = function(data) {
                $('#upload_record_form_result').html(data);
            },
            error: errorHandler = function() {
                alert("Failure");
            },
            data: formData,
            cache: false,
            contentType: false,
            processData: false
        }, 'json');


    });

PHP

<?php
if (isset($_FILES['uploadrecord'])) {
    if ((!empty($_FILES["uploadrecord"])) && ($_FILES['uploadrecord']['error'] == 0)) {

        $filename = basename($_FILES['uploadrecord']['name']);
        $ext = substr($filename, strrpos($filename, '.') + 1);

        $types = array(
            'video/mp4', 'video/3gpp', 'video/divx', 'video/flv', 'video/mpeg', 'video/mpeg-2', 'video/mpeg4', 'video/mpeg4'
        );

        $type = $_FILES['uploadrecord']['type'];
        if (in_array($type, $types) && $_FILES["uploadrecord"]["size"] < 20000000) {

            $new = sha1(date('Y/m/d H:i:s'));
            $newname = dirname(__FILE__) . '/records/' . $new . '.' . $ext;

            if ((move_uploaded_file($_FILES['uploadrecord']['tmp_name'], $newname))) {
                echo 'done';
            } else {
                echo 'failed 1';
            }
        }
   } else {
       echo 'failed 2';
    }
} else {
    echo 'Upload failed 3';
}

当我尝试之前的代码,并上传一个记录文件时,它显示“失败2”,这意味着“错误”代码与0不同。

当我 var_dump 数组 $_FILES['uploadrecord']...这是我得到的:

array (size=5)
  'name' => string 'Nao Robot.flv' (length=13)
  'type' => string '' (length=0)
  'tmp_name' => string '' (length=0)
  'error' => int 1
  'size' => int 0

我不明白,为什么 'tmp_name' 和 type 设置为空字符串,以及为什么 size 设置为 0。

问题究竟出在哪里?是来自客户端还是服务器端脚本?

提前致谢

【问题讨论】:

  • 也许你应该增加你的upload_max_filesize?
  • 谢谢,但是它显示:'failed 2',这意味着它根本没有达到大小条件......它以“if ((!empty($_FILES[" uploadrecord"])) && ($_FILES['uploadrecord']['error'] == 0))" 条件。
  • 我想我明白你想说的了,请原谅我不小心,我知道......你的意思是php.ini的设置,我会尝试反馈给你
  • 如果超过最大文件大小,您的 $_FILES[...]['error'] 将为 1。
  • 不错!小提示:您可以使用 .htaccess 而不是更改 php.ini,当您在不同的服务器/系统上工作时更容易。 (使用 php_value upload_max_filesize)

标签: php jquery ajax file-upload


【解决方案1】:

在 MAC OSX 上:

1) 转到 /etc/php.ini
2) 以权限打开文件以写入/读取
3) 搜索行:

upload_max_filesize = 2M

4) 更改为例如 6MB 或更多:

upload_max_filesize = 6M

5) 使用命令保存并重启 apache:

sudo apachectl restart

【讨论】:

  • 非常感谢您的回答,这些正是我为解决它所做的步骤,我只是忘记在此处添加解决方案。 (这个问题早在 2013 年就被问到了)。干杯!
  • 哦,抱歉耽搁了。我认为这个答案将来会帮助其他用户。谢谢!
最近更新 更多