在PHP中获取重命名的文件名

时间:2018-08-03 12:42:30

标签: php mysql

是否可以在PHP中获得重命名的文件名?我正在尝试此代码,但没有给我.ext我认为我的explode命令存在问题。有人可以帮我吗?

这是我的代码

$target = '..\img\web\users'.DIRECTORY_SEPARATOR;

if ( 0 < $_FILES['file']['error'] ) {
    echo 'Error: ' . $_FILES['file']['error'] . '<br>';
}else{
    $temp = explode(".", $_FILES["file"]["name"]);
    $newfilename = $user['email'] . '.' . end($temp);
    move_uploaded_file($_FILES["file"]["tmp_name"], $target . $newfilename);

    $q = "UPDATE users SET img ='$newfilename' WHERE email = '$user[email]'";
    $r = mysqli_query($dbc, $q);

}

在那之后,它给了我$ newfilename ='uploaded-file'。在我的sql表中没有扩展名。我的扩展名在哪里:))

我正在尝试上传图片文件,并通过用户电子邮件地址进行更改。

编辑:我的输入就像/和jquery:

<img id="img" alt="User Pic" <?php if($user['img'] == ''){ echo 'src="img/web/user.png"'; }else{ echo 'src="img/web/users/'.$user['img'].'"'; } ?>  class="img-circle img-responsive" style="border:1px solid red; min-width:150px; min-height:150px; max-width:150px; max-height:150px;"><br />
<input id="avatar" name="file" type="file" class="btn btn-default btn-sm" style="padding:0px; margin:0px;" autocomplete="off"  accept="image/x-png,image/gif,image/jpeg">

$('#save_details').on('click', function() {
    var file_data = $('#avatar').prop('files')[0];   
    var form_data = new FormData();                  
    form_data.append('file', file_data);

    $.ajax({
        url: 'admin/useredit.php', // point to server-side PHP script 
        dataType: 'text',  // what to expect back from the PHP script, if anything
        cache: false,
        contentType: false,
        processData: false,
        data: form_data,                         
        type: 'post'

     });
});

$ _ FILES的var_dump:

array(1) { 
    ["file"]=> array(5) { 
        ["name"]=> string(9) "index.jpg" 
        ["type"]=> string(10) "image/jpeg" 
        ["tmp_name"]=> string(24) "C:\xampp\tmp\php7489.tmp" 
        ["error"]=> int(0) 
        ["size"]=> int(4465) 
    } 
}

1 个答案:

答案 0 :(得分:0)

我本来要对此发表评论,但是它变得太长了,所以我将其写为答案,并且希望我是正确的:

似乎正在发生的事情是,您在该编辑URL的其他地方发生了另一个调用,该调用没有在file索引处附加图像。

有几种方法可以立即实现:

  1. 也许您不是在ajax调用后阻止正常提交,而是再次发送了正常提交,但是格式编码错误吗? (如果单击该按钮后页面刷新,则很可能就是这种情况。)
  2. 您对此同一脚本有其他ajax调用,设置其他用户 属性,而不是头像图片。
  3. 附录:其他错误也可以实现,请在浏览器的检查控制台/开发工具中查看您的网络活动。

如果我是对的,则以下内容应阻止您看到的内容发生:

if(!empty($_FILES['file'])) {

    if ( 0 < $_FILES['file']['error'] ) {
        echo 'Error: ' . $_FILES['file']['error'] . '<br>';
    }else{
        $temp = explode(".", $_FILES["file"]["name"]);
        $newfilename = $user['email'] . '.' . end($temp);
        move_uploaded_file($_FILES["file"]["tmp_name"], $target . $newfilename);

        $q = "UPDATE users SET img ='$newfilename' WHERE email = '$user[email]'";
        $r = mysqli_query($dbc, $q);
    }
}

同样,假设我在这里是正确的-在不发送文件的额外请求中,$_FILES['file']['error']的计算结果为null(并抛出未定义的索引警告),并且自{{1} }评估为(0 < null),它将运行您的上传过程并更新用户记录,即使该文件未附加在该特定请求中!

添加非空支票应该可以防止您意外地用无扩展名的记录覆盖正确的支票。