【问题标题】:AJAX File Upload with PHP Validation使用 PHP 验证的 AJAX 文件上传
【发布时间】:2016-08-30 03:41:45
【问题描述】:

我有一个包含两个文本字段和一个文件上传字段的表单。

验证完全由 PHP 处理,我使用了一点 Ajax 来检索 PHP 脚本通过数组 (err[]) 生成的错误消息。

我的问题是,我似乎无法让文件上传验证正常工作。 (上传文件时,总是提示“错误的文件格式只接受.png, .gif, .jpg, .jpeg”)

Ajax 如下:

function checkform() {
        $.post('upload.php', $("form#uploadForm").serialize(), function (data) {

                $("div#error").html(data).slideDown("fast");

                var destination = $('div#uploadContainer').offset().top - 15;
                $("html:not(:animated),body:not(:animated)").animate({
                    scrollTop: destination
                }, 200);

            });
    return false;
}

似乎总是会触发以下验证:

$extension = strrchr($_FILES['uploadFile']['name'], '.');
    if (!in_array($extension, $extensions)) {
        $err[]='Wrong file format only .png , .gif, .jpg, .jpeg are accepted';
    }
...
...

【问题讨论】:

标签: javascript php jquery ajax validation


【解决方案1】:

上传和检查文件扩展名的正确逻辑

if (isset($_FILES['uploadFile']) && $_FILES['uploadFile']['size'] != 0)
{
    $extension = end(explode('.', $_FILES['uploadFile']['name']));

    if (!in_array($extension, $extensions))
    {
        $err[]='Wrong file format only .png , .gif, .jpg, .jpeg are accepted';
    }

    // Write code to upload image here
}
else
{
    // There was error while uploading image
    // $_FILES['uploadFile']['error'] gives error code
    //  
    // Possible errors
    // UPLOAD_ERR_OK: 0
    // UPLOAD_ERR_INI_SIZE: 1
    // UPLOAD_ERR_FORM_SIZE: 2
    // UPLOAD_ERR_NO_TMP_DIR: 6
    // UPLOAD_ERR_CANT_WRITE: 7
    // UPLOAD_ERR_EXTENSION: 8
    // UPLOAD_ERR_PARTIAL: 3
}

【讨论】:

  • 这行得通!现在唯一的问题是成功页面出现在错误消息中。
【解决方案2】:

根据@riddell 的评论 (AJAX File Upload with PHP Validation)

问题很可能不是 php,而是 Jquery 本身。 像这样的东西可以工作

var form = $('form')[0];
var data = new FormData(form);

    $.ajax({
      url: 'upload.php',
      data: data ,
      processData: false,
      contentType: false,
      type: 'POST',
      success: function(data){
        alert(data);
      }
    });

【讨论】:

  • 使用此代码让我回到了触发第一个验证规则“请选择图像”的原始问题。 - 它确实适用于其他验证规则:S
  • 在您的 PHP 中尝试 print_r($_FILES); 并在控制台中检查文件是否正在传输。
  • Array ( [uploadFile] => Array ( [name] => pc-1207834.jpg [type] => image/jpeg [tmp_name] => /tmp/phpvG4w9s [error] => 0 [size] => 657386 ) ) 请上传图片
【解决方案3】:

由于 $extension 的扩展名没有点 (.)。从文件扩展名中删除点(。)

$extensions = array('.png', '.gif', '.jpg', '.jpeg','.PNG', '.GIF', '.JPG', '.JPEG');

这将是

$extensions = array('png', 'gif', 'jpg', 'jpeg','PNG', 'GIF', 'JPG', 'JPEG');

希望这能修复错误

【讨论】:

  • 使用@imvain2 的ajax,验证现在可以工作了。然而,成功提交后,页面应该重定向,而不是在错误消息容器内回显?
【解决方案4】:
$extension = end(explode('.', $_FILES['uploadFile']['name']));

if (!in_array($extension, $extensions))
{
    $err[]='Wrong file format only .png , .gif, .jpg, .jpeg are accepted';
}

【讨论】:

  • 恐怕运气不好!即使选择了有效图像,仍会触发验证规则。看来我的验证规则需要工作!
  • 您能粘贴您的验证规则吗?
  • @DavidPottrell 检查新答案。我已经在上面发布了。
  • 使用 strtolower(pathinfo($_FILES['uploadFile']['name'], PATHINFO_EXTENSION)) 而不是那种 hacky 方式来获取扩展名。
  • @DeepakAdhikari 仍然没有运气 - 它仍然显示文件扩展名规则 - 我已经查看了很多次代码,但看不出为什么......
【解决方案5】:
if (isset($_FILES['uploadFile']) && $_FILES['uploadFile']['size'] != 0)
{
    // Upload file
}

【讨论】:

  • 有趣...现在通过了验证规则,但现在我的规则正在被采纳(见原帖)
  • $extension = end(explode('.', $_FILES['uploadFile']['name']));
  • $extension = end(explode('.', $_FILES['uploadFile']['name'])); if (!in_array($extension, $extensions)) { $err[]='错误的文件格式只接受.png、.gif、.jpg、.jpeg'; } ^ 像这样? - 没有格式很难看 - 我非常感谢 Deepak 的帮助
  • @DavidPottrell 我在上面粘贴了带有格式的代码。请向上滚动页面。
猜你喜欢
  • 2014-08-27
  • 2011-04-01
  • 2016-08-03
  • 2010-10-05
  • 1970-01-01
  • 2012-04-03
  • 1970-01-01
  • 2013-03-13
  • 2017-03-26
相关资源
最近更新 更多