Move_uploaded_file trong PHP là gì?

Có thể là bạn muốn khách truy cập tải ảnh lên cho trang tiểu sử thành viên, đính kèm tệp đính kèm vào thông báo diễn đàn hoặc chỉ chia sẻ tệp trên khu vực tải xuống công khai - khả năng xử lý tệp tải lên có thể là một bổ sung tuyệt vời cho các trang web

Cơ sở để tải tệp lên nằm trong một loạt phần tử đầu vào HTML đặc biệt, "tệp", hiển thị hộp thoại chọn tệp trong hầu hết các trình duyệt cho phép khách truy cập của bạn chọn tệp để tải lên. Bạn có thể đưa phần tử này vào biểu mẫu HTML giống như bất kỳ phần tử nào khác - trình duyệt web hiển thị phần tử này dưới dạng hộp văn bản và nút "chọn" (hoặc "duyệt"). Khi biểu mẫu của bạn được gửi, nó sẽ tự động gửi cùng với tệp

Đây là một mẫu HTML ví dụ (lưu dưới dạng upload1. php) cho phép người dùng chọn tệp để tải lên máy chủ của bạn. Lưu ý rằng chúng tôi chỉ định "enctype" trong biểu mẫu của mình để tệp của chúng tôi được truyền đúng cách và thuộc tính hành động của biểu mẫu được đặt thành điểm tải lên2. php, mà chúng ta sẽ xem xét trong giây lát


    Send this file: 

Bạn có thể thấy phần tử tệp đầu vào mới của chúng tôi đang hoạt động - lưu ý rằng chúng tôi đặt tên cho nó là "tệp người dùng". Bây giờ, đây là tập lệnh PHP đi kèm, upload2. php, in ra một ít thông tin về tệp vừa được tải lên từ upload1. php


PHP đặt trước các biến cho bạn liên quan đến tệp vừa tải lên bằng cách sử dụng một biến siêu toàn cầu, $_FILES, để giữ chúng. Mỗi tệp được tải lên được đặt vào mảng siêu toàn cục $_FILES dưới dạng một mảng khác được tạo thành từ thông tin về chính tệp đó - vì vậy chúng ta có một mảng bên trong một mảng (mảng đa chiều)

Nếu chúng ta có hai tệp - tệp một và tệp hai - thay vì chỉ 'tệp người dùng', PHP sẽ đặt hai mảng vào $_FILES, mỗi mảng chứa tên, kích thước và thông tin khác về tệp một và tệp hai tương ứng. Như bạn có thể thấy ở trên, PHP đặt 'tên' và 'kích thước' để cho phép bạn đọc tên tệp gốc do người dùng cung cấp và kích thước của tệp được gửi. Nó cũng đặt 'tmp_name' để cung cấp cho bạn tên tệp có trên máy chủ của bạn (có thể giống như /tmp/tmp000) và cũng đặt 'type', cung cấp cho bạn loại MIME của tệp đã tải lên (e. g. image/png) nếu nó được cung cấp bởi trình duyệt tải lên

Hãy thử tập lệnh tải lên của bạn trong trình duyệt web của bạn - xem liệu bạn có thể tự sửa đổi tập lệnh để kiểm tra xem trình duyệt của bạn có gửi loại MIME hay không. Nếu bạn thấy các tệp có kích thước nhất định không được tải lên đúng cách, bạn có thể thấy mình cần tăng cài đặt trong php của mình. ini, "upload_max_filesize"

Bây giờ chúng ta có thể tải lên một tệp và đọc thông tin về nó, hãy thử điều gì đó hữu ích hơn - cách đặt tệp đã tải lên ở nơi bạn chọn

PHP làm cho điều này đặc biệt dễ dàng thông qua hàm move_uploaded_file(). move_uploaded_file() lấy hai tên tệp làm tham số và trả về false nếu tệp bạn cố di chuyển không được gửi bởi HTTP upload (có lẽ người dùng của bạn đang cố đánh lừa tập lệnh của bạn chạm vào /etc/passwd) hoặc nếu không thể

Tham số đầu tiên phải là tên của tệp đã tải lên mà bạn muốn làm việc với. Điều này tương ứng với $_FILES['userfile']['tmp_name'] nếu bạn đang sử dụng 'userfile' làm thành phần biểu mẫu trong trang HTML tải lên của mình. Tham số thứ hai là tên của tên tệp bạn muốn tệp đã tải lên được chuyển đến. Nếu mọi việc suôn sẻ, PHP trả về true và tệp sẽ ở nơi bạn mong đợi. Chúng ta hãy nhìn vào toàn bộ hoạt động trong hành động


Lưu ý rằng bạn sẽ cần chỉnh sửa /place/for/file thành nơi nào đó PHP có quyền sao chép tệp. Như bạn có thể thấy, việc xử lý tệp tải lên bằng PHP thực sự không thể dễ dàng hơn - lệnh gọi move_uploaded_file() kiểm tra bảo mật và thực hiện tất cả công việc sao chép cho bạn

Hàm move_uploaded_file() và hàm rename() được sử dụng để di chuyển tệp vào một thư mục khác trên máy chủ. Trong trường hợp này, chúng tôi có một tệp đã được tải lên trong thư mục tạm thời của máy chủ từ đó thư mục mới được gán theo phương thức. Tệp tạm thời được di chuyển hoàn toàn đến một vị trí mới. move_uploaded_file() đảm bảo tính an toàn của thao tác này bằng cách chỉ cho phép di chuyển những tệp được tải lên thông qua PHP. Do đó, để di chuyển một tệp đã tải lên, chúng tôi sử dụng phương thức rename()

cú pháp

move_uploaded_file ( string $Sourcefilename, string $destination ) : bool
rename ( string $oldname, string $newname [, resource $context ] ) : bool
  • phương thức move_uploaded_file(). Hàm này kiểm tra để đảm bảo rằng tệp nguồn hoặc '$Sourcefilename' trong cú pháp là tệp tải lên hợp lệ (có nghĩa là tệp được tải lên thông qua cơ chế tải lên HTTP POST của PHP). Nếu tệp hợp lệ, tệp sẽ được chuyển đến tên tệp được cung cấp bởi đích hoặc '$destination' theo cú pháp
    Loại kiểm tra này đặc biệt quan trọng nếu có khả năng bất kỳ điều gì được thực hiện với các tệp đã tải lên có thể tiết lộ nội dung của chúng cho người dùng hoặc thậm chí cho những người dùng khác trên cùng hệ thống. Lưu ý rằng nếu trong trường hợp tệp đích đã tồn tại, nó sẽ bị ghi đè. Vì lý do này, trước tiên tệp phải được kiểm tra tính khả dụng của tệp và sau đó phải thực hiện hành động duy nhất
  • phương thức đổi tên (). Phương pháp này cố gắng đổi tên cũ thành tên mới, di chuyển nó giữa các thư mục nếu cần. Nếu tệp tên mới tồn tại thì nó sẽ bị ghi đè. Nếu đổi tên thư mục newname tồn tại thì chức năng này sẽ phát ra cảnh báo

Ví dụ. Ví dụ này là mã tải tệp lên trong thư mục có tên là Tải lên và sau đó nó thay đổi đường dẫn của nó sang thư mục khác có tên là Mới

Tải lên. html




<html>

________số 8_______

<head>

    <1>

3_______4_______4

3_______4_______6

    8_______4_______1>

8head>

________số 8_______

<<6>

    <html0 html1_______6_______2_______6_______3 html4html2html6

html7html8html2>0>

3

>3_______5__________>5 >6_______6_______2>8 >9html2>8  2html2>8>

3

>3_______5__________ 9<0 9>

3

>3_______5_______>5 >6_______6_______2<9 >9html2<9 head3html2head5>

    8_______6_______0>

8<6>

________số 8_______

8html>7

upfile. php




>8

________số 8_______

    0

    1 html2_______12_______3    4

    5 html2    1     8_______12_______9000102_______7_______8040506

07 08

________số 8_______

10111202<915

16

    18

    4_______10 0022_______4_______00    525

>3_______4_______27 28    4

>3_______4_______07 32

    34

16

    37

    10 0007 42

>3_______4_______27 45    4

    48

16

    51

    53 54

3

>3_______4_______57

>3_______4_______59

>3_______4_______61

>3_______4_______10 64_______4_______0102>8046970

71    525

html727 76    8_______12_______9000102>8040585

86    888    4

90

html792

html71095    5979899

86    9000102>80405<08

<0927 <11    4

html7_______4_______34

html7_______4_______53 54

<0927 <20    4

html7_______4_______34

>3_______4_______34

>3_______4_______53 54

html727 <31    4

>3_______4_______34

    34

34

________số 8_______

<39

Ghi chú. Các thư mục Tải lên và Mới đã tồn tại một lần và do đó bạn sẽ phải tạo chúng nếu chúng không có sẵn bên trong máy chủ

Điều nào đúng về hàm move_uploaded_file()?

Quay lại. Hàm move_uploaded_file() trả về true nếu thành công và false nếu thất bại .

Sự khác biệt giữa move_uploaded_file và sao chép là gì?

Sao chép sẽ sao chép nguồn tệp đến đích trong khi di chuyển sẽ di chuyển tệp . Khi một tệp được sao chép, một bản sao được tạo có nghĩa là bộ đệm (nguồn) tạm thời không được xóa. Khi bạn di chuyển một tệp, nó sẽ bị xóa khỏi vị trí ban đầu có nghĩa là trong bộ đệm tạm thời (nguồn. $_FILES) và di chuyển tệp đến đích.

Kiểu trả về của move_uploaded_file trong PHP là gì?

Giá trị trả về ¶ . Nếu from không phải là tệp tải lên hợp lệ thì sẽ không có hành động nào xảy ra và move_uploaded_file() sẽ trả về false. Nếu from là một tệp tải lên hợp lệ, nhưng không thể di chuyển vì lý do nào đó, sẽ không có hành động nào xảy ra và move_uploaded_file() sẽ trả về false. Returns true on success. If from is not a valid upload file, then no action will occur, and move_uploaded_file() will return false . If from is a valid upload file, but cannot be moved for some reason, no action will occur, and move_uploaded_file() will return false .

Làm cách nào để kiểm tra lỗi move_uploaded_file trong PHP?

move_uploaded_file() sẽ trở lại. .
FALSE nếu tên tệp không hợp lệ
FALSE và đưa ra cảnh báo trong nhật ký lỗi nếu quy trình apache không có quyền đọc/ghi đối với thư mục nguồn hoặc đích