【问题标题】:i can't rename uploaded file name我无法重命名上传的文件名
【发布时间】:2015-06-28 09:52:44
【问题描述】:
<?php

ini_set('post_max_size', '40M');
ini_set('upload_max_filesize', '40M');

$filename = $_FILES['file']['name'];
$filesize = $_FILES['file']['size'];
$tmpname = $_FILES['file']['tmp_name'];
$filetype = $_FILES['file']['type'];
$folder = "uploads/";
$f_folder = $folder.$f_filename;
$date = date("d/m/Y H:i");
$f_filename = rename($filename,$filename.$date);


if (isset($_POST['do']) and $_POST['do'] == 'upload') {
    if (empty($filename)) {
        echo "choose file please";
    } else {
        move_uploaded_file($tmpname,$f_folder);
        echo "file is uploaded in ".$f_folder;
    }
};

echo "
<form action='upload.php' method='post' enctype='multipart/form-data' >

File Path : <input type='file' name='file' />
<br>
<input type='submit' name='do' value='upload' />

</form>
";

?>

任何以 f_ 开头的 var 这意味着它是最终结果 错误:

警告:重命名(aaaaa.PNG,aaaaa.PNG28/06/2015 12:45) [function.rename]:在线(php文件目录)中没有这样的文件或目录 13

警告:move_uploaded_file(uploads/) [function.move-uploaded-file]: 无法打开流:第 20 行(php 文件目录)中的权限被拒绝

警告:move_uploaded_file() [function.move-uploaded-file]:无法 将 'C:\Windows\TEMP\php4A5B.tmp' 移动到(php 文件目录)中的 'uploads/' 第 20 行文件上传到 uploads/

【问题讨论】:

  • 这里有几个问题可能是问题所在,不要在文件名中加上“/”斜杠,因为你会混淆重命名命令。让你的文件牦牛。改用“-”连字符。不要在文件名中添加“”空格,这不明智。这可能是权限问题,请检查apache/nginx用户是否有权在您的上传目录中创建文件。

标签: php file-upload file-rename


【解决方案1】:

这是您的正确代码。您可以在移动时重命名文件。

<?php
ini_set('post_max_size', '40M');
ini_set('upload_max_filesize', '40M');

if (isset($_POST['do']) and $_POST['do'] == 'upload') {
  $filename = $_FILES['file']['name'];
  $filesize = $_FILES['file']['size'];
  $tmp_name = $_FILES['file']['tmp_name'];
  $file_type = $_FILES['file']['type'];
  $date = date("d-m-Y_H-i");
  $temp = explode(".", $filename);
  $new_filename = $temp[0] . '-' . $date . '.' . end($temp);
  $f_folder = "uploads" . DIRECTORY_SEPARATOR . $new_filename;

  if (empty($filename)) {
      echo "choose file please";
  } else {
      move_uploaded_file($tmp_name, $f_folder);
      echo "file is uploaded in " . $f_folder;
  }
};

 echo "
 <form method='post' enctype='multipart/form-data' >
  File Path : <input type='file' name='file' />
  <br>
  <input type='submit' name='do' value='upload' />
  </form>";
?>

【讨论】:

  • 关于explode 的使用,如果是文件名:bla1.bla2.png,根据您的代码,结果将是:bla1-{date}.bla2。您可以使用last($temp); 轻松修复它,以确保您使用的是最后一个点之后的字符串。
  • 工作正常。你知道如何防止用户上传相同的文件吗?
  • 您可以使用 md5_file() 或 sha1_file() 控制,但如果您加载文件的数量不是很好的解决方案。或者你可以使用一些没有日期的文件名控件。这很简单,但如果用户更改文件名则不起作用。
【解决方案2】:

您的代码已损坏。在用户提交表单之前,您无法从$_FILES 获取任何变量,$_POST["do"](提交)的值始终是“上传”。一些托管公司不允许您使用move_uploaded_file(),但不用担心,您可以改用rename()。先移动文件,然后重命名,两者都使用rename()。而且您不应该只是将文件大小设置为变量而不对其进行任何操作,您还应该检查它,以避免在不告诉用户任何内容的情况下拒绝太大的文件。

<?php
if($_SERVER["REQUEST_METHOD"] == "POST"){
    $filename = $_FILES['file']['name'];
    $filesize = $_FILES['file']['size'];
    if($filesize > 41943040){
        echo "File too large(max. 40MB)";
    } 
    elseif(empty($filename)){
        echo "choose file please";
    }
    else{
        $tmpname = $_FILES['file']['tmp_name'];
        $folder = "uploads/";
        $date = date("d-m-Y H:i");
        $f_filename = $filename. pathinfo($filename, PATHINFO_FILENAME) . $date . pathinfo($filename, PATHINFO_EXTENSION);
        $f_folder = $folder . rename($tmpname,$f_folder);
        echo "File was uploaded to " . $f_folder;
    }
}
?>
<form action='upload.php' method='post' enctype='multipart/form-data' >
File Path : <input type='file' name='file' />
<br>
<input type='submit' name='do' value='Upload' />
</form>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    相关资源
    最近更新 更多