【问题标题】:How to upload files to specific subdirectory如何将文件上传到特定子目录
【发布时间】:2023-09-04 02:16:01
【问题描述】:

我正在做一个简单的事情,即使用 PHP 上传文件。
我的表格:

<form action="upload.php" enctype="multipart/form-data" method="POST">
    <input type="hidden" name="MAX_FILE_SIZE" value="1000000">
    <input type="file" name="file_upload">
    <input type="submit" name="submit" value="Upload">
</form>

和 PHP:

$id = '3';
if (isset($_POST['submit'])) {
    $tmp_file = $_FILES['file_upload']['tmp_name'];
    $file = basename($_FILES['file_upload']['name']);
    $upload_dir = "uploads";
    if (file_exists($upload_dir."/".$file)) {
        die("File {$file} already exists in {$upload_dir} folder.");
    }
    if(move_uploaded_file($tmp_file, $upload_dir."/".$file)) {
        $message = "File " . $file . " uploaded to " . $upload_dir;
        echo $message;
    } else {
        # Code with message about error.
    }
 }   

文件仅在uploads 文件夹中成功上传。在那个uploads 文件夹中,我还有几个其他文件夹:123 等等。

我的问题:上传后如何移动特定子文件夹中的文件? (子文件夹名称——来自变量id。)谢谢!

【问题讨论】:

  • 你想movecopy???
  • $upload_dir = "uploads/" . $id;
  • 这是我正在尝试的,如果变量是 "uploads/" . $id 它不会上传。但我得到UPLOAD_ERR_OK
  • 那个文件夹是动态生成的吗?检查这些文件夹的权限。
  • 问题出在文件夹的权限上(正如@Toretto 建议的那样),感谢所有 cmets 解决我的问题。

标签: php forms


【解决方案1】:

有效的方法:

此方法在文件上传时移动文件。

    if (!empty($post_array['IconURI'])) {
        $IconURI_current_path = "./" . $post_array['IconURI'];
        if (file_exists($IconURI_current_path)) {
            // Desired folder structure
            $structure = './uploads/' . $primary_key . "/";
            // To create the nested structure, the $recursive parameter 
            // to mkdir() must be specified.
            if (is_dir($structure) || mkdir($structure, 0777, true)) {
                $dir = './uploads/' . $primary_key . "/" . $post_array['IconURI'];
                chmod("$IconURI_current_path", 0777);
                if (copy("$IconURI_current_path", "$dir")) {
                    @unlink("$IconURI_current_path");
                    //rename IconURI from [ 9723d-632ac-e325b-db1b8-icon.jpg ] 
                    $IconURI = "uploads/" . $primary_key . "/" . $post_array['IconURI'];
                }
            } else {
                die('Failed to create folders...');
            }
        } else {
            echo "Banner file does not exist";
        }
    }

该脚本还处理文件权限。有时由于目录或文件权限文件无法移动。

可以用作Grocery CRUD 或其他第三方插件中的回调函数。即这些插件将文件上传到它们的默认目录,您有时需要将文件移动到其他特定目录。

【讨论】: