Как создать собственный URL для загруженных пользователем файлов с помощью php

0

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

Например: пользователь загружает файл с именем stack.png и загружается в каталог http://www.website.com/uploads/stack.png

Но я хочу разрешить пользователю просматривать/загружать тот же файл в http://www.website.com/username/uploads/stack.png

Обратите внимание, что я не хочу использовать сокращающие/изменяющие скрипты url, я хочу как-то отобразить URL-адрес файла в этом месте. Таким образом, пользователь может вставить файл на свой веб-сайт или в блог, используя URL-адрес "http://www.website.com/username/uploads/stack.png" вместо "http://www.website.com/uploads/stack.png"

Возможно ли это? Если да, то как я могу это сделать, используя php.

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

  • 0
    Как бы вы справились с двумя пользователями, загружающими файл с именем stack.png ?
  • 0
    Почему вы хотите хранить все изображения в / uploads, а не создавать одну директорию для каждого пользователя?
Теги:
.htaccess
mod-rewrite

2 ответа

1
Лучший ответ

Вопрос, который вы задаете, непросто быстро ответить. Существует не простое решение на базе PHP, которое вы можете скопировать и вставить за 5 секунд. Функция, которую вы предлагаете, обычно подразумевает некоторую форму перезаписи URL, схему маршрутизации или функциональность для этого.

Также на сайте с тысячами пользователей, возможно, где каждый пользователь может загружать много файлов, вы должны начать думать о том, как хранить файлы файлов в файловой системе. Тысячи файлов в плоском каталоге просто не сократят его.

Хорошо. Вот наивный пример того, как вы могли бы решить это:

Скажем, вы фактически храните файлы в форме:

/uploads/<username>_<filename>.<extension>

Прочитайте mod_rewrite и создайте правило перезаписи на своем веб-сервере следующим образом:

RewriteRule ^(.*)/uploads/(.*) getfiles.php?username=$1&file=$2

Это позволит вам использовать URL, например

/<username>/uploads/<filename>.<extension>

Создайте php script с именем 'getfiles.php' и верните файл таким образом

<?php

$path = '/uploads/'.$_GET['username'].'_'.$_GET['file'];

if (!file_exists($path)) {
    die(
        "OMFG! The user tried to access a file that doesn't exist. " .
        "I think I'm gonna die!"
    );
}

header('Location: '.$path);

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

1

Вы можете использовать директиву соответствия псевдонимам в своей конфигурации VHost: AliasMatch ^/[^/]+/(.*) /usr/local/uploads/$1

Дополнительная информация на http://httpd.apache.org/docs/1.3/mod/mod_alias.html

  • 0
    Хороший ответ. +1 от меня.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню