$_FILES 为空且不包含任何数据 [重复]

Posted

技术标签:

【中文标题】$_FILES 为空且不包含任何数据 [重复]【英文标题】:$_FILES empty and does not contain any data [duplicate] 【发布时间】:2017-03-29 22:56:53 【问题描述】:

在描述我的问题之前,我确实在互联网和本网站上进行了搜索以找到解决方案。我发现了一个与我的问题非常相似的问题,但是给出的答案甚至不接近,所以我在这里写我的问题。

问题是: 我有form 有一些输入字段加上input type='file' 用于上传图像。 jquery-ui dialog 里面的这个表单,当我提交 form 时,所有字段都应该是响应,除了 input type='file'for 图像它从不携带图像的任何数据。 这是解释我的问题的代码:

update_form.php:

<form action="" class="fixed-dialog" method="post" id="customForm" enctype="multipart/form-data">
    <input type="file" class="form-group input-field" accept="image/jpg,image/png,image/jpeg,image/gif" id="image" name="image" />
</form>

当用户点击Send按钮时,这段代码会触发(JQuery)

$("#send").click(function()
    var all = $("#customForm").serialize();
    //the following condition is to check if all input fields were filled.
    $.ajax(
        type: "POST",
        url: "includes/update_user_info.php",
        data: all,
        success: function(data)
            if(data == 1)
                alert("You have update data successfuly");
                window.location = "index.php";
            else
                 alert("there is an error");
            
        
    );
);

这里是 update_user_info.php: 将图像从 tmp 文件移动到其他文件

$user_image           = &$_FILES['image']['name'];
$user_image_type      = &$_FILES['image']['type'];
$user_temp_image      = &$_FILES['image']['tmp_name'];
if(isset($_FILES['image']))
    $_SESSION['errors'] = "it's set.\n";

    //the next statement is empty, it should carry some data.
    $_SESSION['errors'] .= $_FILES['image']['tmp_name'];
else
    $_SESSION['errors'] = "NOT SET YET!!!";


$target = "./images/users_img/".$user_image;
$source = $_FILES['image']['tmp_name'];
//        if($_FILES['image']['error'] == 0)
            move_uploaded_file($_FILES['image']['tmp_name'],$target);
            $_SESSION['errors'] .= "Target is: ".$_FILES['image']['tmp_name'];
            if(is_uploaded_file($_FILES['image']['tmp_name']))
                $_SESSION['errors'] .= "Target is: it Worked";
                echo 1;
            else
                $_SESSION['errors'] .= "Target is: NOT WORKING";
                echo 1;
            
//        else
//            $_SESSION['errors'] .= "Something went Wrong!!";
//            echo 1;
//        

当我尝试回显$_FILES['image']['tmp_name']、或['name']['error']时,它总是给我一个错误:未定义索引:名称/tmp_name/或错误isset($_FILES['image']) = TRUE。但是:$_FILES['image']['name'] 为空。

任何帮助将不胜感激。 谢谢。

【问题讨论】:

如果您使用 ajax 提交,在表单本身上设置 enctype 是没有用的。您需要设置 ajax 请求来执行相同的操作。谷歌“使用 ajax 上传文件”有很多例子展示了如何使用 formData 而不是序列化。 Ajax 上传二进制数据需要一些额外的工作和浏览器支持。你在测试什么? 【参考方案1】:

我不相信您可以通过这种方式发送文件输入(仅通过序列化)。

这是你必须做的:

var data = new FormData();
jQuery.each(jQuery('#file')[0].files, function(i, file) 
  data.append('file-'+i, file);
);

然后你可以通过ajax发送它们

firstnameInputValue = $('#firstnameInput').val();
jQuery.ajax(
  url: 'php/upload.php',
  data: 
    file: data,
    firstname: firstnameInputValue
  ,
  cache: false,
  contentType: false,
  processData: false,
  type: 'POST',
  success: function(data)
    alert(data);
  
);

在那里找到它:Sending multipart/formdata with jQuery.ajax

过去处理过。

【讨论】:

作为附加参考,这里有一个壮观的插件,用于抽象这种行为并确保跨浏览器的一致性:malsup.com/jquery/form。我以前用过,很好用。 如果你在那里找到它,那么这个问题就是那个问题的副本。 @CharlotteDunois 是的,我已经标记了它 @YannChabot 谢谢.. 但现在我如何在文件输入中附加其他输入字段? @bakursait 查看更新后的答案,您可以将 DATA 作为对象发送。然后,您可以在 PHP 脚本 $_POST['firstname'] 中处理它,POST 数组的键将是您在作为数据参数值提供的 javascript 对象中提供的键。

以上是关于$_FILES 为空且不包含任何数据 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

检查字符串是不是不为空且不为空

obj类型属性取值,属性嵌套取值,为空且不存在安全取值方法

Laravel/Eloquent/DB 查询 - 当为空且不为空时加入

PHP - $_FILES 数组为空 [重复]

Mybatis中关于字符串字段的判断不为空且不为null

提交表单后 $_FILES 为空 [重复]