PHP - Di chuyển tệp vào một thư mục khác trên máy chủ


181

Tôi cần cho phép người dùng trên trang web của mình xóa hình ảnh của họ khỏi máy chủ sau khi họ đã tải chúng lên nếu họ không còn muốn chúng nữa. Trước đây tôi đã sử dụng unlinkhàm trong PHP nhưng đã được thông báo rằng điều này có thể khá rủi ro và là một vấn đề bảo mật. (Mã trước đây :)

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

Thay vào đó bây giờ tôi chỉ muốn chuyển tập tin vào một thư mục khác. Điều này phải có thể được thực hiện trong một thời gian dài sau khi họ lần đầu tiên tải lên tệp để bất cứ khi nào họ đăng nhập vào tài khoản của họ. Nếu tôi có thư mục chính lưu trữ hình ảnh người dùng:

user/

và sau đó trong một thư mục có tên del là đích để đặt các hình ảnh không mong muốn của họ:

user/del/

Có một lệnh để di chuyển một tập tin vào một thư mục khác nhau? Vì vậy, nói rằng:

user/image1.jpg

di chuyển đến / trở thành

user/del/image1.jpg

Câu trả lời:


420

Các renamechức năng thực hiện điều này

đổi tên tài liệu

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

Nếu bạn muốn giữ tệp hiện có ở cùng một nơi bạn nên sử dụng copy

tài liệu sao chép

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

Nếu bạn muốn di chuyển một tệp đã tải lên, hãy sử dụng move_uploaded_file, mặc dù điều này gần giống như renamechức năng này cũng kiểm tra xem tệp đã cho có phải là tệp được tải lên qua hay không POST, điều này ngăn cản việc tệp cục bộ được di chuyển

tài liệu 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");
    }
}

đoạn mã từ tài liệu


Một vấn đề với đổi tên () và sao chép () là bạn bị mất tất cả các siêu dữ liệu, chẳng hạn như ngày được tạo và sửa đổi .. có ý nghĩ đó.
Musikdoktor


17

Nếu bạn muốn di chuyển tệp trong đường dẫn mới với tên tệp gốc. dùng cái này:

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

Làm việc như người ở.
ucMedia

1

Một số giải pháp trước tiên là sao chép () tệp (như đã đề cập ở trên) và khi tệp đích tồn tại - tệp unlink () từ bản địa hóa trước đó. Ngoài ra, bạn có thể xác thực tổng kiểm MD5 trước khi hủy liên kết để đảm bảo


1

Tạo một chức năng để di chuyển nó:

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

1

Tôi sử dụng shell đọc tất cả các tệp dữ liệu sau đó gán cho mảng. Sau đó, tôi di chuyển tập tin ở vị trí hàng đầu.

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

Vui lòng giải thích thêm - làm thế nào điều này có thể làm việc bằng PHP?
Nico Haase

0

sử dụng bản sao ()unlink () chức năng

$moveFile="path/filename";
if (copy($csvFile,$moveFile)) 
{
  unlink($csvFile);
}

-4

shell_exec ('mv tên tệp Dest_filename');


2
Chào mừng bạn đến với Stack Overflow! Mặc dù đoạn mã này có thể giải quyết câu hỏi, bao gồm một lời giải thích thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn. Xin vui lòng cố gắng không làm đông mã của bạn với các bình luận giải thích, điều này làm giảm khả năng đọc của cả mã và các giải thích!
Filnor
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.