PHP - ย้ายไฟล์ไปยังโฟลเดอร์อื่นบนเซิร์ฟเวอร์


182

ฉันต้องอนุญาตให้ผู้ใช้ในเว็บไซต์ของฉันลบภาพออกจากเซิร์ฟเวอร์หลังจากที่พวกเขาอัปโหลดหากพวกเขาไม่ต้องการพวกเขาอีกต่อไป ก่อนหน้านี้ฉันเคยใช้unlinkฟังก์ชั่นใน PHP แต่หลังจากได้รับแจ้งว่าสิ่งนี้อาจมีความเสี่ยงและปัญหาด้านความปลอดภัย (รหัสก่อนหน้าด้านล่าง :)

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

ตอนนี้ฉันต้องการย้ายไฟล์ไปที่โฟลเดอร์อื่นแทน สิ่งนี้จะต้องสามารถทำได้นานหลังจากที่พวกเขาอัปโหลดไฟล์ครั้งแรกดังนั้นเมื่อใดก็ตามที่พวกเขาเข้าสู่บัญชีของพวกเขา หากฉันมีโฟลเดอร์หลักที่เก็บภาพผู้ใช้:

user/

จากนั้นภายในโฟลเดอร์ที่เรียกว่าเดลซึ่งเป็นปลายทางสำหรับวางรูปภาพที่ไม่ต้องการ:

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ป้องกันเช่นนี้ว่าแฟ้มท้องถิ่นจะถูกย้าย

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

ส่วนย่อยของรหัสจากเอกสาร


ปัญหาหนึ่งที่มีการเปลี่ยนชื่อ () และคัดลอก () คือคุณสูญเสียข้อมูลเมตาทั้งหมดเช่นวันที่สร้างและแก้ไขเช่น .. มีอยู่ในใจ
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 ได้อย่างไร
Nico Haase


-4

shell_exec ('mv ชื่อไฟล์ dest_filename');


2
ยินดีต้อนรับสู่ Stack Overflow! ในขณะที่ข้อมูลโค้ดนี้อาจแก้ไขคำถามรวมถึงคำอธิบายช่วยปรับปรุงคุณภาพของโพสต์ของคุณ จำไว้ว่าคุณกำลังตอบคำถามสำหรับผู้อ่านในอนาคตและคนเหล่านั้นอาจไม่ทราบสาเหตุของการแนะนำรหัสของคุณ โปรดอย่าพยายามทำให้รหัสของคุณแน่นเกินไปด้วยคำอธิบายที่อธิบายซึ่งจะช่วยลดความสามารถในการอ่านของทั้งรหัสและคำอธิบาย!
Filnor
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.