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

182

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

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

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

user/

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

user/del/

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

user/image1.jpg

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

user/del/image1.jpg
odd_duck
источник

Ответы:

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");
    }
}

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

MKroeders
источник
Одна из проблем, связанных с 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 перед отменой связи, чтобы убедиться,

quardas
источник
1

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

function move_file($file, $to){
    $path_parts = pathinfo($file);
    $newplace   = "$to/{$path_parts['basename']}";
    if(rename($file, $newplace))
        return $newplace;
    return null;
}
Marcelo
источник
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?
Нико
0

использование копия () и Unlink () функция

$moveFile="path/filename";
if (copy($csvFile,$moveFile)) 
{
  unlink($csvFile);
}
Арунпрабакаран М
источник
-4

shell_exec ('mv filename dest_filename');

user10395079
источник
2
Добро пожаловать в стек переполнения! Хотя этот фрагмент кода может решить вопрос, в том числе объяснение действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин, по которым вы предлагаете код. Также постарайтесь не переполнять ваш код пояснительными комментариями, это снижает удобочитаемость кода и пояснений!
Филнор