จะลบไฟล์ด้วย PHP ได้อย่างไร?


174

ฉันจะลบไฟล์ออกจากเซิร์ฟเวอร์ด้วย PHP ได้อย่างไรหากไฟล์นั้นอยู่ในไดเรกทอรีอื่น

นี่คือเค้าโครงหน้าของฉัน:

  • projects/backend/removeProjectData.php (ไฟล์นี้ลบข้อมูลทั้งหมดของฉันสำหรับฐานข้อมูลและควรลบไฟล์ที่เกี่ยวข้องด้วย)
  • public_files/22.pdf (สถานที่ที่ไฟล์ตั้งอยู่)

ฉันใช้unlinkฟังก์ชั่น:

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

แต่นี่ทำให้ฉันเกิดข้อผิดพลาดว่าไม่มีไฟล์อยู่ ความคิดใด ๆ


2
<pre> ใช้เส้นทางสัมบูรณ์ </pre>
Pavunkumar

1
หากคุณไม่ตรวจสอบโดยใช้เส้นทางจริงคุณมีโอกาสที่จะได้รับ "." และ ".. " ที่ไม่ใช่ไฟล์เช่นกันทำให้ไฟล์ไม่มีข้อผิดพลาด
DrogoNevets

1
แต่ระวังนี่อาจจะไม่ลบไฟล์ของคุณถ้าไฟล์ของคุณมีชื่อไฟล์ / symlink หลายไฟล์! ดูกระทู้นี้สำหรับข้อมูลเพิ่มเติม: stackoverflow.com/q/17548906/1114320
Sliq

คำตอบ:


229

ดังต่อไปนี้น่าจะช่วยได้

  • realpath - ส่งคืนชื่อพา ธ สัมบูรณ์ที่ได้รับการยอมรับ
  • is_writable - บอกว่าชื่อไฟล์นั้นเขียนได้หรือไม่
  • unlink - ลบไฟล์

เรียกใช้ไฟล์พา ธ ของคุณผ่าน realpath จากนั้นตรวจสอบว่าพา ธ ที่ส่งคืนนั้นสามารถเขียนได้หรือไม่และหากเป็นเช่นนั้น


7
ฉันสงสัยว่า w3shools กำลังทำสิ่งนี้อย่างไร w3schools.com/php/func_filesystem_delete.asp
Fr0zenFyr

3
@Gordon ฉันขอโทษ .. ฉันใช้คำผิดซึ่งสร้างความแตกต่างใหญ่ .. ฉันยอมรับว่ามันเป็นคนงี่เง่า .. แต่สิ่งที่ฉันพยายามที่จะหมายถึงเป็นตัวอย่างการเข้ารหัสจะเป็นประโยชน์มากขึ้น .. ถ้าฉันต้องการไปที่ลิงค์อื่น ๆ สาม เข้าใจคำตอบของคุณมันมีประโยชน์มากไหม .. เสียใจอีกครั้งสำหรับคำผิด .. ฉันไม่ได้มาจากประเทศที่พูดภาษาอังกฤษ ... แม้ว่ามันจะไม่สามารถแก้ตัว ...
Ritabrata Gautam

13
@RitabrataGautam "ถ้าฉันต้องการเยี่ยมชมลิงค์อื่นอีกสามลิงก์เพื่อเข้าใจคำตอบของคุณมันมีประโยชน์มากหรือไม่ - ใช่แล้ว. เพราะหลังจากไปที่ลิงก์คุณจะได้เข้าใจวิธีการใช้งาน ถ้าฉันแค่ให้รหัสคุณคุณจะไม่เข้าใจ แต่เพียงแค่คัดลอกและวาง แล้วคุณเรียนรู้อะไร ไม่มีอะไร นอกจากนี้รหัสสำหรับที่เล็กน้อยมาก
Gordon

1
@Gordon .. ฉันยอมรับ .. ความคิดเห็นของคุณต้องการความเคารพ .. คุณได้รับ # 185K .. เพียงสองคำถามด่วน ... 1> ถ้าฉันพิจารณาคำตอบของคุณว่าสมบูรณ์แล้วทำไมผู้ดูแลหลายคนที่นี่บอกว่าคุณควรให้รหัสด้วย ... ไม่ใช่แค่ลิงก์ (มันทำให้การโหวตลดลงมาก) ... 2> จะไม่ดีกว่าถ้าคุณใส่รหัส ตอนนี้ผู้ที่มีแนวโน้มในการเรียนรู้พวกเขาจะไปที่ลิงก์เหล่านั้นอย่างแน่นอนและผู้ที่ไม่มีพวกเขาจะไปที่ google อีกครั้งเพื่อรับโค้ดที่พร้อมใช้งาน
Ritabrata Gautam

2
คำตอบดูเหมือนตรงไปตรงมาพอสำหรับฉัน: แต่ตัวอย่างรหัสที่คุณต้องการ: $ path = realpath ('../../ public_files /'. $ fileName); if (is_writable ($ path)) {unlink ($ path);}
me_

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

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

11
โหวตขึ้นสำหรับการใช้งานfile_existsฟังก์ชั่น มิฉะนั้นคุณจะได้รับข้อผิดพลาดหากไฟล์นั้นไม่มีอยู่
มาห์ดี

17

ตรวจสอบสิทธิ์ของคุณก่อนอื่นในไฟล์เพื่อให้แน่ใจว่าคุณสามารถก) ดูจากสคริปต์ของคุณและ b) สามารถลบได้

นอกจากนี้คุณยังสามารถใช้เส้นทางที่คำนวณจากไดเรกทอรีที่คุณใช้งานสคริปต์ในปัจจุบันเช่น:

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

(ใน PHP 5.3 ฉันเชื่อว่าคุณสามารถใช้__DIR__ค่าคงที่แทนได้dirname()แต่ฉันยังไม่ได้ใช้ด้วยตัวเอง)


ฉันตรวจสอบการอนุญาตแล้วฉันไม่สามารถดูไฟล์ได้ในตอนแรก แต่ตอนนี้ทุกอย่างทำงานได้ดีขอบคุณ realpath ขอบคุณสำหรับคำแนะนำ
Ken

7

คุณสามารถลบไฟล์โดยใช้

unlink($Your_file_path);

แต่ถ้าคุณลบไฟล์ออกจากเส้นทาง http การยกเลิกการเชื่อมโยงนี้จะไม่สามารถทำได้ คุณต้องให้เส้นทางไฟล์ที่ถูกต้อง


4

โซลูชัน AIO จัดการทุกอย่างไม่ใช่งานของฉัน แต่ฉันเพิ่งปรับปรุงตัวเอง สนุก!

/**
 * 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);
}

ดูสมบูรณ์แบบขอบคุณมาก แต่โปรดอัปเดตเนื่องจากคุณไม่สามารถใช้unlinkเป็นชื่อสำหรับฟังก์ชั่นของคุณ
Reham Fahmy

หากเป็นฟังก์ชันสาธารณะคงที่ในชั้นเรียนยกเลิกการเชื่อมโยงเป็นชื่อฟังก์ชั่นที่ถูกต้อง: 3v4l.org/MgA2l
nadar

ใช่ แต่ในสถานการณ์ปัจจุบัน Standalone เป็นตัวเลือกที่ดีกว่า
Junaid Atari

1

ฉันรู้ว่าคำถามนี้ค่อนข้างเก่า แต่นี่เป็นสิ่งที่ง่ายสำหรับฉันที่จะลบภาพออกจากโปรเจคที่ฉันทำงานอยู่

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

dirname(__FILE__)ส่วนพิมพ์ออกเส้นทางพื้นฐานในโครงการของคุณ /img/tasks/สองโฟลเดอร์ลงมาจากเส้นทางฐานของฉัน และในที่สุดก็มีภาพของฉันที่ฉันต้องการลบซึ่งคุณสามารถทำสิ่งที่คุณต้องการ

ด้วยวิธีนี้ฉันไม่เคยมีปัญหาใด ๆ ในการเข้าถึงไฟล์ของฉันบนเซิร์ฟเวอร์ของฉันและลบออก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.