【问题标题】:Get renamed Filename in PHP在 PHP 中获取重命名的文件名
【发布时间】:2018-08-03 12:42:29
【问题描述】:

是否可以在 PHP 中重命名文件名?我正在尝试这段代码,但它没有给我 .ext 我认为我的爆炸​​命令有问题。谁能帮帮我?

这是我的代码

$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) 
    } 
}

【问题讨论】:

  • 我有点惊讶它没有用,在纸上看起来还不错(没有我运行/测试它)
  • move_uploaded_file 是否按预期工作?可能是“img”列不够大?
  • 实际上,它给了我诸如未定义索引:文件,未定义索引:名称等错误。但也上传。我正在使用 jquery 文件上传(通过 ajax)
  • @IncredibleHat var_dump($_FILES); --> 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) } }
  • 在我的 mysql 数据库中:img 列是 varchar --> 长度是 200。我认为足够了

标签: php mysql


【解决方案1】:

我打算把它写成评论,但它太长了,所以我会把它写成一个答案,希望我是对的:

似乎正在发生的事情是,您在其他地方对该编辑 URL 进行了另一个调用,该 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(并引发未定义索引警告),并且由于 (0 &lt; null) 评估为 false它会运行您的上传处理并更新用户记录即使该文件未附加在该特定请求中!

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

【讨论】:

    猜你喜欢
    • 2014-01-20
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 2015-03-18
    相关资源
    最近更新 更多