Làm thế nào để xóa một tập tin thông qua PHP?


174

Làm cách nào để xóa một tệp khỏi máy chủ của tôi bằng PHP nếu tệp nằm trong thư mục khác?

Đây là bố cục trang của tôi:

  • projects/backend/removeProjectData.php (tệp này xóa tất cả các mục nhập của tôi cho cơ sở dữ liệu và cũng nên xóa tệp liên quan)
  • public_files/22.pdf (nơi đặt tệp.)

Tôi đang sử dụng unlinkchức năng:

unlink('../../public_files/' . $fileName);

Nhưng điều này luôn mang đến cho tôi một lỗi mà tập tin không tồn tại. Có ý kiến ​​gì không?


2
<pre> Sử dụng đường dẫn tuyệt đối </ pre>
Pavunkumar

1
nếu bạn không kiểm tra bằng đường dẫn thực, có khả năng bạn sẽ nhận được "." và ".." cũng không phải tệp, khiến tệp không tồn tại lỗi
DrogoNevets

1
Nhưng hãy cẩn thận, điều này có thể không thực sự xóa tệp của bạn nếu tệp của bạn có nhiều tên tệp / liên kết tượng trưng! Xem chủ đề này để biết thêm thông tin: stackoverflow.com/q/17548906/1114320
Sliq

Câu trả lời:


229

Sau đây sẽ giúp

  • realpath - Trả về tên đường dẫn tuyệt đối được chuẩn hóa
  • is_writable - Cho biết tên tệp có thể ghi được không
  • unlink - Xóa một tập tin

Chạy filepath của bạn thông qua realpath, sau đó kiểm tra xem đường dẫn được trả về có thể ghi được không và nếu có, hãy bỏ liên kết nó.


7
Tôi tự hỏi làm thế nào w3shools đang làm điều này? w3schools.com/php/func_filesystem_delete.asp
Fr0zenFyr

3
@Gordon tôi xin lỗi .. tôi đã sử dụng thuật ngữ sai tạo ra sự khác biệt lớn .. tôi đồng ý nó là ngu ngốc .. nhưng điều tôi cố gắng nói là một ví dụ mã hóa sẽ hữu ích hơn .. nếu tôi cần truy cập ba liên kết khác để hiểu câu trả lời của bạn là nó rất hữu ích? .. xin lỗi lần nữa vì từ sai .. tôi không đến từ quốc gia nói tiếng Anh ... mặc dù đó không thể là một cái cớ ...
Ritabrata Gautam

13
@RitabrataGautam "nếu tôi cần truy cập ba liên kết khác để hiểu câu trả lời của bạn thì có hữu ích không?" - Vâng, đúng vậy. Bởi vì sau khi đi đến các liên kết, bạn sẽ hiểu nó hoạt động như thế nào. Nếu tôi chỉ cung cấp cho bạn mã, bạn sẽ không hiểu mà chỉ sao chép và dán. Bạn đã học được gì sau đó? Không có gì. Bên cạnh đó, mã cho điều đó là rất nhỏ.
Gordon

1
@Gordon .. tôi đồng ý .. quan điểm của bạn yêu cầu sự tôn trọng .. bạn đã kiếm được nó # 185K .. chỉ cần hai câu hỏi nhanh ... 1> nếu tôi coi câu trả lời của bạn là đầy đủ thì tại sao nhiều người kiểm duyệt ở đây nói rằng bạn cũng nên cung cấp một số mã ... không chỉ các liên kết (nó gây ra nhiều lượt bình chọn) ... 2> sẽ không tốt hơn nếu bạn đặt một số mã. bây giờ ai có xu hướng học tập chắc chắn họ sẽ truy cập vào các liên kết đó và ai không có thì họ sẽ lại truy cập google để lấy mã sẵn sàng.
Ritabrata Gautam

2
câu trả lời dường như đủ thẳng với tôi: nhưng ví dụ mã bạn muốn: $ path = realpath ('../../ public_files /'. $ fileName); if (is_writable ($ path)) {hủy liên kết ($ path);}
me_

102
$files = [
    './first.jpg',
    './second.jpg',
    './third.jpg'
];

foreach ($files as $file) {
    if (file_exists($file)) {
        unlink($file);
    } else {
        // File not found.
    }
}

11
bỏ phiếu cho việc sử dụng file_existschức năng. Nếu không, bạn sẽ gặp lỗi nếu tệp không tồn tại.
Mahdi

17

Trước tiên hãy kiểm tra quyền của bạn trên tệp, để đảm bảo bạn có thể a) xem nó từ tập lệnh của mình và b) có thể xóa nó.

Bạn cũng có thể sử dụng đường dẫn được tính từ thư mục bạn hiện đang chạy tập lệnh, ví dụ:

unlink(dirname(__FILE__) . "/../../public_files/" . $filename);

(trong PHP 5.3 Tôi tin rằng bạn có thể sử dụng __DIR__hằng số thay vì dirname()nhưng tôi chưa sử dụng nó)


Tôi đã kiểm tra các quyền và ban đầu tôi không thể xem tệp nhưng bây giờ mọi thứ đều hoạt động nhờ vào giao diện. cảm ơn vì lời khuyên
Ken

7

Bạn có thể xóa tập tin bằng cách sử dụng

unlink($Your_file_path);

nhưng nếu bạn đang xóa một tệp khỏi đường dẫn http thì việc hủy liên kết này không hoạt động đúng. Bạn phải đưa ra một đường dẫn tập tin chính xác.


4

Giải pháp AIO, xử lý mọi thứ, Đó không phải là công việc của tôi nhưng tôi chỉ tự cải thiện bản thân. Thưởng thức!

/**
 * Unlink a file, which handles symlinks.
 * @see https://github.com/luyadev/luya/blob/master/core/helpers/FileHelper.php
 * @param string $filename The file path to the file to delete.
 * @return boolean Whether the file has been removed or not.
 */
function unlinkFile ( $filename ) {
    // try to force symlinks
    if ( is_link ($filename) ) {
        $sym = @readlink ($filename);
        if ( $sym ) {
            return is_writable ($filename) && @unlink ($filename);
        }
    }

    // try to use real path
    if ( realpath ($filename) && realpath ($filename) !== $filename ) {
        return is_writable ($filename) && @unlink (realpath ($filename));
    }

    // default unlink
    return is_writable ($filename) && @unlink ($filename);
}

trông hoàn hảo, cảm ơn rất nhiều nhưng xin vui lòng cập nhật nó vì bạn không thể sử dụng unlinklàm tên cho chức năng của mình.
Reham Fahmy ngày

Nếu là hàm tĩnh công khai trong một lớp, hủy liên kết là tên hàm hợp lệ: 3v4l.org/MgA2l
nadar

Vâng, nhưng trong kịch bản hiện tại, Độc lập là một lựa chọn tốt hơn.
Atari

1

Tôi biết câu hỏi này hơi cũ, nhưng đây là một điều đơn giản phù hợp với tôi để xóa hình ảnh khỏi dự án của tôi.

unlink(dirname(__FILE__) . "/img/tasks/" . 'image.jpg');

Phần dirname(__FILE__)này in ra đường dẫn cơ sở đến dự án của bạn. Có /img/tasks/hai thư mục từ đường dẫn cơ sở của tôi. Và cuối cùng, có hình ảnh của tôi tôi muốn xóa mà bạn có thể thực hiện thành bất cứ điều gì bạn cần.

Với điều này, tôi không gặp vấn đề gì khi truy cập các tệp của mình trên máy chủ và xóa chúng.

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.