2012-05-15 5 views
1

В моем проекте, я должен загрузить некоторые видео файлы в папку, которая находится за пределами корневой папки. Я использую простую функцию php move_uploaded_file для загрузки файла. Я пробовал с кодом ниже.Загрузите файлы в папку вне корневой папки на сервере Linux?

$source = $_FILES['Filedata']['tmp_name']; 
$targetFile = '/usr/local/WowzaMediaServer-3.1.1/content/video.mp4' 
move_uploaded_file($source,$targetFile); 

Но он не работает. Можем ли мы это сделать через move_uploaded_file. если нет, предложите лучший вариант для этого.

Я видел какой-то подобный вопрос, но ничего не помогает. Поэтому любая помощь была бы оценена.

+1

убедитесь, что пользователь, выполняющий веб-сервер (иногда www-data), имеет права записи в файл mp4. – Pavel

+1

вы должны предоставить разрешение на запись другому пользователю в этой папке temp. –

+0

@Pavel: Я использую привилегию суперпользователя. –

ответ

2

Скорее всего, это простая проблема с разрешениями и довольно легко решить.

  1. Найти пользователя, которого использует apache. Для этого откройте файл httpd.conf и искать что-то вроде:

    апач Пользователь
    Группа апача

  2. сменить владельца папки, которую вы пытаетесь загрузить на.

    chown -R apache.apache /usr/local/WowzaMediaServer-3.1.1/содержание/

  3. Изменить права доступа к папке

    CHMOD -R 775 /usr/local/WowzaMediaServer-3.1.1/content/

и что должно быть.

+0

Спасибо, Роб. Это сработало для меня .. –

1

Это опасный подход, поскольку он предоставляет привилегии пользователю apache, поэтому используйте его с осторожностью.

Добавить пользователя apache в список sudoers - который позволит вам выполнять команды с правами root через php через system('sudo the_command'). Затем переместите загруженный файл во временное место, которое может написать пользователь apache (например, создайте каталог «tmp» в корне doc). Затем используйте system("sudo mv \"$source\" \"$destination\"");, чтобы переместить временный файл в его окончательное местоположение.

Вы можете найти пользователя apache, выполнив <?php echo exec('whoami'); ?>. Затем добавьте следующую запись в sudoers the-apache-user ALL=(ALL) NOPASSWD: ALL. Используйте visudo, чтобы добавить запись sudoer.

Пример:

$source = $_FILES['Filedata']['tmp_name']; 
$targetFile = '/usr/local/WowzaMediaServer-3.1.1/content/video.mp4' 

$tempLocation = 'tmp/temp-file.mp4'; 

move_uploaded_file($source, $tempLocation); 

system('sudo mv "' . $tempLocation . '" "' . $targetFile . '"'); 

Edit: Связанные вопрос - How to run PHP exec() as root?

+4

Ничего себе, здравомыслящий системный администратор никогда не даст привилегиям root root apache! Я думаю, что лучше и проще просто сделать каталог __/usr/local/WowzaMediaServer-3.1.1/content/__ доступным для записи пользователем apache. – Ponytech

+2

Это полный избыток, который похож на простую проблему с разрешениями, и он открывает сервер для всех видов неприятных потенциальных атак. Не делай этого! Когда-либо. Если для какой-то причудливой причины вам когда-либо понадобился веб-сервер, чтобы выполнить что-то как root, правильный способ использовать липкий бит в двоичном файле, который выполняет одну маленькую функцию, которая должна выполняться как root. Таким образом, вы можете открыть небольшую ограниченную дыру в своей безопасности, а не выдувать ее - и даже это я бы не рекомендовал в целом. –

+0

При всем уважении это сумасшедшее, глупое и потенциально опасное предложение. –

0

Лучшим решением было бы написать файл где-то, где вы можете написать (т.е. под вебсервера), а затем создать символическую ссылку из каталога мультимедиа, где вы его написали.

Например:

  • Web Корень/вар/WWW/HTML
  • Вы хотите его на /usr/local/WowzaMediaServer-3.1.1/content/
  • Создать каталог/вар/WWW/HTML/MediaServer/содержание/
  • Make разрешения на/вар/WWW/HTML/MediaServer/содержание/777 (так апач может написать к нему)
  • Копирование файлов из /usr/local/WowzaMediaServer-3.1.1/content/to/var/www/html/mediaserver/content/
  • Удалить /usr/local/WowzaMediaServer-3.1.1/content/ (только каталог «content»)
  • Создать символическую ссылку из /usr/local/WowzaMediaServer-3.1.1/content/ to/var/www/html/mediaserver/content/

Тогда у вас есть разрешения на чтение/запись, а также на медиа-сервере. Единственная проблема заключается в том, что если медиа-сервер обучен не читать символические ссылки, но вы можете быстро это выяснить.

+0

Я не согласен. Загрузки никогда не должны входить в корень сети. Проблема в том, что люди могут потенциально использовать ваш сервер, чтобы разделить всевозможные неприятные вещи без вашего ведома. Лучше делать то, что вы пытаетесь сделать, загрузить в область вне корня веб-сайта, а затем, если вам нужно предложить эти файлы другим людям, сценарий будет эхо-файл (после выполнения необходимых проверок проверки подлинности). –

+0

Также вы должны избегать установки разрешений в любом веб-каталоге на 777. Вы должны всегда ограничивать разрешения настолько сильно, насколько это возможно, чтобы выполнить работу. 777 ленив и может означать, что файлы доступны для людей, которым не нужно иметь доступ. –

+0

Только если вы в противном случае неаккуратно. Но тогда, если вы недостаточно осторожны, любой может сделать что-либо на вашем сервере. Программа права, и вы абсолютно в порядке. – Robbie

2

Я собираюсь предположить, что вы используете Apache для целей этого ответа.

Во-первых, загружен ли файл в порядке? Одна из возможных причин, по которой у вас могут быть проблемы, заключается в том, что каталог tmp недоступен для записи веб-сервером или читается. Предположим, что это нормально, поэтому move_uploaded_file должен работать нормально.

Создайте папку рядом с вашим DOCUMENT_ROOT, назовем ее «filestore». Убедитесь, что он доступен для записи по www-данным или любому пользователю, выполняющему apache. Теперь вы должны перенести файлы в эту папку. Обратите внимание, что они будут принадлежать www-data: www-data обычно - или любой пользователь и группа, на которой настроен ваш сервер, запускаются как. Причина, по которой я помещаю папку «filestore» рядом с папкой DOCUMENT_ROOT, заключается в том, что вы можете быть уверены, что веб-сервер может прочитать путь к файлу до DOCUMENT_ROOT. В противном случае вы рискуете попасть в папку, путь к которой не читается, и это остановит вас. например если у вас/usr/local/media в качестве целевой папки и/usr/local не читается (и выполняется) веб-сервером, вы тосты.

Если все это работает, и вы абсолютно должны иметь свои медиа в другом месте, вы можете иметь папку «filestore» в любом месте, пока весь путь к ней будет читаться/исполняться веб-сервером. Проверьте каждый каталог в пути.

Если эти загружаемые файлы загружаются другими пользователями через Интернет, папка «filestore» должна иметь только разрешения 700, поскольку она всегда будет пользователем веб-сервера, который их читает. Если другим пользователям нужен доступ, как правило, потому что другое программное обеспечение, работающее как другой пользователь, должно их использовать, тогда вам может потребоваться разрешение 750, чтобы члены группы могли читать (и выполнять) каталог. Вам также необходимо добавить этого пользователя в группу www-data.

Для загрузки вам нужно будет написать простой скрипт, который выгружает файл в браузер после выполнения некоторых проверок проверки подлинности. Таким образом, вы избегаете наличия средств массовой информации только через http без какой-либо проверки подлинности в первую очередь, что может сделать ваш сервис привлекательным местом для незаконных файлов (нарушения авторских прав в данном случае наименее опасны).

1

Всегда сталкивайтесь с проблемой с кодом, посмотрите журнал сервера или включите отображение ошибок. Тем не менее, ваша проблема может быть связана с настройкой upload_tmp_dir. Проверьте, что скажет phpinfo() или посмотрите на ваш файл php.ini.

3

Вы уверены, что не находитесь в тюрьме с chroot?

Если это так, ваше «абсолютное» имя пути может указывать на неправильное место - где-то, что не существует.

Если это так, измените путь к точке где-то внутри тюрьмы.

Возможно, необходимо указать mount --bind каталог, в котором вы хотите, чтобы это произошло в каком-либо месте в тюрьме. (Обратите внимание, что символическая ссылка не будет работать для выхода из тюрьмы.)

Смежные вопросы