PHP - переместить файл в другую папку на сервере


182

Мне нужно разрешить пользователям на моем сайте удалять свои изображения с сервера после того, как они их загрузили, если они больше не хотят их. Ранее я использовал эту unlinkфункцию в PHP, но с тех пор мне сказали, что это может быть довольно рискованным и проблемой безопасности. (Предыдущий код ниже :)

if(unlink($path.'image1.jpg')){ 
     // deleted
}

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

user/

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

user/del/

Есть ли команда переместить файл в другую папку? Так что говорите:

user/image1.jpg

переходит в / становится

user/del/image1.jpg

Ответы:


421

renameФункция делает это

переименование документов

rename('image1.jpg', 'del/image1.jpg');

Если вы хотите сохранить существующий файл в том же месте, вы должны использовать copy

копия документов

copy('image1.jpg', 'del/image1.jpg');

Если вы хотите переместить загруженный файл, используйте move_uploaded_file, хотя это почти то же самое, что renameэта функция также проверяет, является ли данный файл файлом, который был загружен через POST, это предотвращает, например, перемещение локального файла.

документы move_uploaded_file

$uploads_dir = '/uploads';
foreach ($_FILES["pictures"]["error"] as $key => $error) {
    if ($error == UPLOAD_ERR_OK) {
        $tmp_name = $_FILES["pictures"]["tmp_name"][$key];
        $name = $_FILES["pictures"]["name"][$key];
        move_uploaded_file($tmp_name, "$uploads_dir/$name");
    }
}

фрагмент кода из документации


Одна из проблем, связанных с rename () и copy (), заключается в том, что вы потеряли все метаданные, например, дату создания и изменения ... имейте это в виду.
Musikdoktor


17

Если вы хотите переместить файл по новому пути с сохранением исходного имени файла. использовать это:

$source_file = 'foo/image.jpg';
$destination_path = 'bar/';
rename($source_file, $destination_path . pathinfo($source_file, PATHINFO_BASENAME));

Работал как шарм.
ucMedia

1

Некоторым решением является сначала скопировать () файл (как упомянуто выше), а когда целевой файл существует - файл unlink () из предыдущей локализации. Кроме того, вы можете проверить контрольную сумму MD5 перед отменой связи, чтобы убедиться,


1

Создайте функцию для ее перемещения:

function move_file($file, $to){
    $path_parts = pathinfo($file);
    $newplace   = "$to/{$path_parts['basename']}";
    if(rename($file, $newplace))
        return $newplace;
    return null;
}

1

Я с помощью оболочки прочитал весь файл данных, затем назначил массиву. Затем я перемещаю файл в верхнюю позицию.

i=0 
for file in /home/*.gz; do
    $file
    arr[i]=$file
    i=$((i+1)) 
done 
mv -f "${arr[0]}" /var/www/html/

Пожалуйста, объясните это далее - как это может работать с использованием PHP?
Нико


-4

shell_exec ('mv filename dest_filename');


2
Добро пожаловать в стек переполнения! Хотя этот фрагмент кода может решить вопрос, в том числе объяснение действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин, по которым вы предлагаете код. Также постарайтесь не переполнять ваш код пояснительными комментариями, это снижает удобочитаемость кода и пояснений!
Филнор
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.