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

  • Автор темы itprom
  • 29
  • Обновлено
  • 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()).

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

itprom


Рег
03 Nov, 2015

Тем
1

Постов
3

Баллов
13
  • 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

Тем
1

Постов
3

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

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

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

munt


Рег
13 Apr, 2014

Тем
0

Постов
2

Баллов
2
  • 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

Тем
0

Постов
1

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

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

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

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

Tornado909


Рег
19 Sep, 2013

Тем
1

Постов
2

Баллов
12
Тем
49554
Комментарии
57426
Опыт
552966

Интересно