【发布时间】:2020-07-05 20:37:41
【问题描述】:
我正在尝试设置允许用户将文件上传到服务器上的目录(共享主机)的功能。用户可以输入上传文件夹名称并选择文件。如果文件夹不存在,则会创建它。
请注意,这不是一个大型上传系统,但仅适用于一个用户。
我的代码在localhost 上运行良好。
使用公共服务器(共享主机),可以创建文件夹。但是里面没有文件显示。
上传功能,process.php:
// run code only if post request went through
if ($_SERVER['REQUEST_METHOD'] === 'POST' ) {
if (isset($_POST['folder'])) {
$folder = $_POST['folder'];
} else {
$folder = 'new-folder';
}
// ensure that there are files inside the array to actually upload
if (isset($_FILES['files'])) {
$errors = [];
$path = '/dir/data/uploads/images/' . $folder . "/";
// if folder does not exist, create it
if (!file_exists($path)) {
mkdir($path, 0777, true);
} else {
//stuff
}
$all_files = count($_FILES['files']['tmp_name']);
for ($i = 0; $i < $all_files; $i++) {
$file_name = $_FILES['files']['name'][$i];
$file_tmp = $_FILES['files']['tmp_name'][$i];
$file_type = $_FILES['files']['type'][$i];
$file_size = $_FILES['files']['size'][$i];
$tmp = explode('.', $_FILES['files']['name'][$i]);
$file_ext = strtolower(end($tmp));
$file = $path . $file_name;
// here follow multiple verifications on the file name, type, size, etc...
// removed to keep code shorter
if (empty($errors)) {
move_uploaded_file($file_tmp, $file);
}
}
if ($errors) print_r($errors);
}
}
尝试和观察:
在网络选项卡中,我得到
status code 200。服务器上目标文件夹
images的读写执行权限(暂时,用于测试!)设置为777、(rwxrwxrwx)。我测试了不同的文件和不同的文件夹名称(新的和现有的),但我尝试上传的文件从未显示。
我注意到尽管在我的代码中使用
mkdir($path, 0777, true);创建文件夹,但服务器上的文件夹的权限设置为705、(rwx---r-x)。我对在
localhost上运行良好的版本的代码所做的唯一更改是我更改了$path。
我收到的错误消息:
Warning: mkdir(): Read-only file system in /path/to/scripts/process/process.php on line 31
/folder/data/uploads/images/test/image.webp --
Warning: move_uploaded_file(/folder/data/uploads/images/test/image.webp): failed to open stream: No such file or directory in /path/to/scripts/process/process.php on line 75
因此:
Warning: move_uploaded_file(): Unable to move (...)
- 第 31 行是
mkdir($path, 0777, true); - 第 75 行是
move_uploaded_file($file_tmp, $file);
我找到了几个针对此问题的 Linux 文件系统修复程序。但是在使用共享主机时我该怎么做呢?
这是我第一次尝试,非常感谢您的帮助。
【问题讨论】:
-
你可以通过 ssh 连接吗?您很可能需要为公共上传创建一个文件夹,并指定您的主机允许 Web 用户(通常是 www 或 www-data)递归地写入该文件夹的公共组。类似 chown -R www-data:www-data images
-
我认为他们只为云托管提供 ssh。但我可能错了。我从来没有使用过ssh。我可以调查一下。按原样,我可以更改我网站空间上文件夹的读写执行权限。但是即使我让每个人都可以读写文件,它也不起作用。
-
目录 /dir/data/uploads/images/ 在您的公共 Web 根目录中吗?我在猜测,但只允许公共用户组上传到公共文件夹。我刚刚注意到的另一件事:您的图像具有您的主机可能不允许的扩展名 .webp。您是否尝试上传 jpg?
-
它应该在公共网络根目录中,是的。 jpg的错误是一样的。但是,我的标头中有一个用于图像的 JavaScript 预加载函数,它向我返回状态代码
403 forbidden。还有两个 .htaccess 文件(一个在数据文件夹中,一个在上传文件中)。我没有写它们或把它们放在那里,我不确定这一点,但也许问题可能与这些 .htaccess 文件之一有关?我现在才想到。无论如何,我会调查他们。
标签: php file-permissions shared-hosting mkdir