Использование symlink() – не могу заставить его работать правильно

  • Автор темы Sav_new
  • Обновлено
  • 16, May 2024
  • #1
Хорошо.

Я создаю галерею, где пользователи могут войти в систему для загрузки в свои папки или просто просмотреть страницу через «общедоступный» (не вошедший в систему) — я пытаюсь сделать возможным делиться загрузками из вошедшего в систему пользователя в общую папку без необходимости дублировать файлы.

Для этого я пытаюсь использовать symlink() - который работает (в том смысле, что файл, который я нажимаю «сделать общедоступным», получает символическую ссылку, созданную в общей папке, - однако ссылка не возвращается к фактическому файлу в папке пользователя).

Я немного в растерянности относительно того, что мне нужно делать.

Код make_public выглядит следующим образом:

 
<?php
if (!session_id()) { session_start(); };
require_once('conf/config.php');
 $symbolic = (isset($_POST['filename']) ? $_POST['filename'] : '');
 if (!empty($symbolic)) {
 $username = ((isset($_POST['username']) && !empty($_POST['username'])) ? $_POST['username'].'/' : $username);
 $fullpath = $userpath.$username.'/'.$symbolic;

 $checkthumbs = explode('/',$symbolic);
 $checkthumbs[1] = ($checkthumbs[0] == 'video') ? $checkthumbs[1].'.jpg' : $checkthumbs[1];
 $thumbs = ($checkthumbs[0] == 'pictures' || $checkthumbs[0] == 'video') ? symlink($userpath.$username.$checkthumbs[0].'/thumbs/'.$checkthumbs[1],$userpath.'public/'.$checkthumbs[0].'/thumbs/'.$checkthumbs[1]) : false;
 symlink($userpath.$username.$symbolic,$userpath.'public/'.$symbolic);
 if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
 echo json_encode(["content"=>"File made public","infotype"=>"success"]);
 } else {
 header('location: gallery');
 }
 }
?>


PHP: Что происходит, так это то, что «цель» (первая часть символической ссылки ()), похоже, использует папку «public/» в качестве цели вместо папки с именем пользователя.

Не совсем понимаю, почему, потому что если я повторю имя пользователя $username, оно покажет правильное значение. Ссылка создается в правильной папке, но не распознается как ссылка, если я использую для нее is_link() или readlink() (возвращает bool(false) в var_dump()).

Есть ли у кого-нибудь какие-нибудь советы о том, как я могу сделать это правильно? Например, общедоступный файл представляет собой изображение. Что мне нужно, чтобы показать его как обычный файл изображения в общедоступной галерее?

Sav_new


Рег
24 Sep, 2009

Тем
65

Постов
208

Баллов
583
  • 18, May 2024
  • #2
Я не. Переменные заполняются (это те же самые переменные, которые используются для перемещения и удаления файлов, они просто перемещены в этот файл и изменены имена некоторых переменных). Возвращаемые значения для двух эхо следующие:

Первое эхо:

пользователи/admin/pictures/01_06_03_060.jpg

пользователи/public/pictures/01_06_03_060.jpg

Второе эхо:

пользователи/admin/pictures/thumbs/01_06_03_060.jpg

пользователи/public/pictures/thumbs/01_06_03_060.jpg

Это точные места размещения.

Однако я немного не уверен, нужен ли мне полный путь — символическая ссылка должна работать с динамической ссылкой, верно? Или мне нужна полная ссылка ($_SERVER['DOCUMENT_ROOT'])?
 

MaxButler


Рег
03 Mar, 2016

Тем
56

Постов
184

Баллов
504
  • 21, May 2024
  • #3
Realpath имеет слишком много потенциальных ловушек в разных системах.

DOCUMENT ROOT, кажется, работает отлично на любом типе системы, на которой я до сих пор тестировал.

Кроме того, это потребует переписывания некоторых частей кода, что мне сейчас не по силам. Что касается очистки пользовательского ввода, я согласен, над этим тоже нужно поработать - хотя на самом деле с этим не так уж много можно сделать.
 

Munt


Рег
13 Apr, 2014

Тем
64

Постов
181

Баллов
501
  • 21, May 2024
  • #4
Я бы повторил

 echo($userpath.$username.$symbolic,$userpath.'public/'.$symbolic);
echo($userpath.$username.$checkthumbs[0].'/thumbs/'.$checkthumbs[1],$userpath.'public/'.$checkthumbs[0].'/thumbs/'.$checkthumbs[1])


Код (php):

 symlink($userpath.$username.$symbolic,$userpath.'public/'.$symbolic); symlink($userpath.$username.$checkthumbs[0].'/thumbs/'.$checkthumbs[1],$userpath.'public/'.$checkthumbs[0].'/thumbs/'.$checkthumbs[1]); 


Код (php): чтобы узнать, действительно ли он связывает нужный файл. Скорее всего, вы создаете несуществующую символическую ссылку.
 

ReaGed


Рег
28 Jul, 2013

Тем
70

Постов
200

Баллов
570
  • 08, Jun 2024
  • #5
Нет, в настоящее время это работает на MAMP (OSX) - возможно, поэтому это не работает, конечно.

Трудно найти случаи, специфичные для OSX, для чтения.

Но я проверю полные пути, посмотрим, поможет ли это.

Однако на самом деле это не имеет значения, поскольку тестовый сервер настроен как виртуальный хост, и все остальное работает как задумано.
 

Tornado909


Рег
19 Sep, 2013

Тем
61

Постов
205

Баллов
540
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно