Làm cách nào tôi có thể tải lên tệp PHP trực tuyến?

Using /var/www/uploads in the example code is just criminal, imnsho.

One should *NOT* upload untrusted files into your web tree, on any server.

Nor should any directory within your web tree have permissions sufficient for an upload to succeed, on a shared server. Any other user on that shared server could write a PHP script to dump anything they want in there!

The $_FILES['userfile']['type'] is essentially USELESS.
A. Browsers aren't consistent in their mime-types, so you'll never catch all the possible combinations of types for any given file format.
B. It can be forged, so it's crappy security anyway.

One's code should INSPECT the actual file to see if it looks kosher.

For example, images can quickly and easily be run through imagegetsize and you at least know the first N bytes LOOK like an image.  That doesn't guarantee it's a valid image, but it makes it much less likely to be a workable security breaching file.

For Un*x based servers, one could use exec and 'file' command to see if the Operating System thinks the internal contents seem consistent with the data type you expect.

I've had trouble in the past with reading the '/tmp' file in a file upload.  It would be nice if PHP let me read that file BEFORE I tried to move_uploaded_file on it, but PHP won't, presumably under the assumption that I'd be doing something dangerous to read an untrusted file.  Fine.   One should move the uploaded file to some staging directory.  Then you check out its contents as thoroughly as you can.  THEN, if it seems kosher, move it into a directory outside your web tree.  Any access to that file should be through a PHP script which reads the file.  Putting it into your web tree, even with all the checks you can think of, is just too dangerous, imnsho.

There are more than a few User Contributed notes here with naive (bad) advice.  Be wary.

PHP là một trong những ngôn ngữ lập trình phổ biến nhất để xử lý các ứng dụng phía máy chủ của các trang web và dịch vụ web. Nó bao gồm tất cả các chức năng để tải lên, xác thực và xác minh các tệp được tải lên từ phía máy khách. Tập lệnh tải lên tệp có thể được thực hiện trong vòng chưa đầy 5 phút

Với một chút nỗ lực, bạn có thể tạo một tập lệnh máy chủ, chẳng hạn như cho phép người dùng tải ảnh hồ sơ lên ​​trang web của bạn và xếp chúng vào một thư mục. Bản thân trình tải lên tương đối dễ dàng, nhưng các tác vụ khác, chẳng hạn như gửi tệp nhanh đến máy khách thông qua CDN hoặc thêm hình mờ vào hình ảnh tải lên, sẽ yêu cầu các giải pháp phức tạp hơn

Trong bài viết này, chúng tôi sẽ đề cập đến hai tùy chọn sau và tiết lộ những ưu và nhược điểm của chúng

  • Tải tệp lên máy chủ của riêng bạn và tạo tập lệnh tải lên máy chủ PHP từ đầu
  • Sử dụng dịch vụ như Uploadcare qua PHP để xử lý tải lên, lưu trữ và phân phối tệp thông qua CDN (AWS)

Nếu bạn cần tạo một trình tải lên tệp cơ bản và bạn không muốn hàng nghìn tệp hình ảnh tràn ngập bộ nhớ máy chủ của mình từ người dùng trên toàn thế giới, hãy tự làm điều đó. Ngoài ra, giải pháp này phù hợp với các tác vụ tải lên rất cụ thể và các hệ thống khép kín (ngân hàng, quốc phòng và cơ sở chính phủ) với các chính sách nghiêm ngặt không cho phép gia công tệp tải lên cho dịch vụ của bên thứ ba

  • Toàn quyền kiểm soát quá trình tải lên
  • Đơn giản (hoặc không, tùy thuộc vào yêu cầu của bạn)
  • Giải pháp miễn phí (với điều kiện là bạn miễn phí chi phí phát triển)

  • Mất nhiều thời gian để tạo và tùy chỉnh trình tải lên PHP (xác thực, xử lý)
  • Thậm chí nhiều thời gian hơn để tạo ra một dịch vụ có thể chịu được tải trọng cao và ngăn ngừa lỗi
  • Gửi tệp chậm hơn vì không có CDN liên quan. Thiết lập trình tải lên CDN là một nhiệm vụ khác sẽ không được đề cập trong bài viết này
  • Sử dụng các tài nguyên bổ sung để hỗ trợ và duy trì tập lệnh trong tương lai
  • Không hoạt động cho các ứng dụng dành cho thiết bị di động ngay lập tức (cần kết nối thêm với kiến ​​trúc ứng dụng của bạn)
  • Lo ngại về bảo mật — tin tặc thích các tập lệnh tự chế

Để theo dõi bài viết này, bạn sẽ cần phải có một máy chủ web (Apache, nginx, v.v. ) với bất kỳ phiên bản PHP nào được cài đặt gần đây (phiên bản 7. x bao gồm một số cải tiến về Phiên và CURL liên quan đến việc tải tệp lên)

Hãy chắc chắn rằng php. ini cho phép tải tệp lên (được bật theo mặc định). Ngoài ra, bạn có thể đặt một số hạn chế, chẳng hạn như kích thước tối đa cho tệp được tải lên, số lượng tệp được tải lên trên mỗi đoạn, v.v. Đây là một phần của tệp khởi tạo này có liên quan đến việc tải tệp lên

;;;;;;;;;;;;;;;;
; File Uploads ;
;;;;;;;;;;;;;;;;

; Whether to allow HTTP file uploads.
file_uploads = On

upload_tmp_dir = /Applications/MAMP/tmp/php

; Maximum allowed size for uploaded files.
upload_max_filesize = 2M

; Maximum number of files that can be uploaded via a single request
max_file_uploads = 20

Nếu bạn không thể xác định vị trí của php. ini trên máy tính của bạn, hãy tạo tập lệnh bằng lệnh sau

phpinfo();

Và sau đó khởi chạy nó trong trình duyệt web của bạn. Nó sẽ hiển thị cho bạn đường dẫn đến tệp khởi tạo, giống như trong ảnh chụp màn hình bên dưới

Làm cách nào tôi có thể tải lên tệp PHP trực tuyến?
Định vị tệp php ini

Thông thường, có hai phương pháp tải tệp lên chung trong. POST mà chúng tôi sẽ sử dụng trong bài viết này;

Có hai loại tệp chung có thể đi qua POST. tệp văn bản và tệp nhị phân. Tệp hình ảnh (. jpg,. png,. gif, v.v. ) là các tệp nhị phân, vì vậy chúng tôi sẽ làm việc với loại đó. Nhân tiện, trong HTML, kiểu mã hóa này được mô tả là multipart/form-data

Trước tiên, chúng ta cần xử lý mã phía máy khách trong HTML và tạo biểu mẫu cho phép người dùng chọn tệp để tải lên

Tạo một thư mục dự án PHP-upload trong thư mục gốc của trang web của bạn (e. g. , public_html, htdocs hoặc www), sau đó tạo một tệp

phpinfo();
0 mới ở đó

Sao chép và dán đoạn mã sau vào tệp mới tạo của bạn. Nó có một biểu mẫu đơn giản với đầu vào chọn tệp và nút gửi

DOCTYPE html>
<html>
<body>
  <form action="uploadHandling.php" method="post" enctype="multipart/form-data">
    Select image to upload:
    <input type="file" name="fileToUpload" id="fileToUpload">
    <input type="submit" value="Upload Image" name="submit">
  form>
body>
html>

Biểu mẫu

phpinfo();
1 đề cập đến tập lệnh sẽ xử lý các quy trình tải lên ở phía máy chủ. Như chúng tôi đã đề cập trước đó, phương pháp phân phối dữ liệu sẽ là
phpinfo();
2

phpinfo();
3 được đặt thành multipart/form-data, nghĩa là bạn đang sử dụng các biểu mẫu có quyền kiểm soát tệp tải lên và không có ký tự nào được mã hóa

Tên tập lệnh máy chủ phải khớp với tên chúng tôi đã đề cập trong HTML. Tạo một thư mục có tên là

phpinfo();
5 trong thư mục dự án của bạn. Nó sẽ lưu trữ các tập tin đến

Sao chép và dán tập lệnh

phpinfo();
6 này làm giải pháp phía máy chủ cho trình tải lên tệp/hình ảnh của bạn

// Config
$currentDirectory = getcwd();
$uploadDirectory = '/uploads/';
$fileExtensionsAllowed = ['jpeg', 'jpg', 'png']; // These will be the only file extensions allowed
$fileLimitMb = 5; // File limit in MB
$uploadOk = true;

$fileName = $_FILES['fileToUpload']['name'];
$fileSize = $_FILES['fileToUpload']['size'];
$fileTmpName  = $_FILES['fileToUpload']['tmpName'];
$fileType = $_FILES['fileToUpload']['type'];
$fileExtension = strtolower(end(explode('.', $fileName)));

$uploadPath = $currentDirectory . $uploadDirectory . basename($fileName);

// Check if image file is an actual image or fake image
if (isset($_POST['submit'])) {
  if (getimagesize($fileTmpName) !== false) {
    echo 'File is an image - ' . $check['mime'] . '.';
    $uploadOk = true;
  } else {
    echo 'File is not an image.';
    $uploadOk = false;
  }
}

// Check if file already exists
if ($uploadDirectory . basename($fileName) {
  echo 'File already exists.';
  $uploadOk = false;
}

// Check file size
if ($fileSize > ($fileLimitMb * 100000)) {
  echo 'File must be less than ' . $fileLimitMb . 'MB.';
  $uploadOk = false;
}

/*
// Allow certain file formats; needs to do foreach from array fileExtensionsAllowed
if ($imageFileType != $fileExtensionsAllowed  {
  echo 'Sorry, only JPG, JPEG, PNG & GIF files are allowed.';
  $uploadOk = false;
}*/

// Check if $uploadOk then process
if ($uploadOk == false) {
  echo 'File couldn\'t be uploaded.';
} else {
  if (move_uploaded_file($fileTmpName, $target_file)) {
    echo 'The file ' . basename($fileName) . ' has been uploaded.';
  } else {
    echo 'Sorry, there was an error uploading your file.';
  }
}

Hãy để tôi chia nhỏ nó cho bạn và mô tả chi tiết, vì vậy chúng ta đang ở trên cùng một trang về chính xác những gì tập lệnh này làm

Đối tượng

phpinfo();
7 chứa tất cả các phương tiện truy cập tệp và các thuộc tính của tệp, chẳng hạn như tên, kích thước và phần mở rộng tệp

  • phpinfo();
    8 — tên gốc của tệp do khách hàng tải lên
  • phpinfo();
    9 — loại MIME của tệp (e. g. , "image/gif" cho hình ảnh) do trình duyệt cung cấp
  • DOCTYPE html>
    <html>
    <body>
      <form action="uploadHandling.php" method="post" enctype="multipart/form-data">
        Select image to upload:
        <input type="file" name="fileToUpload" id="fileToUpload">
        <input type="submit" value="Upload Image" name="submit">
      form>
    body>
    html>
    0 — kích thước tệp tính bằng byte
  • DOCTYPE html>
    <html>
    <body>
      <form action="uploadHandling.php" method="post" enctype="multipart/form-data">
        Select image to upload:
        <input type="file" name="fileToUpload" id="fileToUpload">
        <input type="submit" value="Upload Image" name="submit">
      form>
    body>
    html>
    1 — tên theo đó tệp mới tải lên được đặt trên máy chủ trước khi hoàn tất tất cả các bước kiểm tra (e. g. , nếu có một tệp có cùng tên)

Chúng tôi sẽ bao gồm các kiểm tra cơ bản cần thiết về loại tệp (vì trong trường hợp của chúng tôi, tệp phải là ảnh) và kích thước tệp (e. g. , dưới 2MB)

Đừng quên rằng bạn có thể đặt mức tối đa tuyệt đối cho các tệp tải lên trong

DOCTYPE html>
<html>
<body>
  <form action="uploadHandling.php" method="post" enctype="multipart/form-data">
    Select image to upload:
    <input type="file" name="fileToUpload" id="fileToUpload">
    <input type="submit" value="Upload Image" name="submit">
  form>
body>
html>
2. Tập lệnh cụ thể này sẽ có các giới hạn tùy chỉnh riêng cho tác vụ tải lên hình ảnh này

Làm cách nào tôi có thể tải lên tệp PHP trực tuyến?
Giao diện trình tải lên tệp PHP mặc định

Bạn sẽ cần tạo CSS của riêng mình cho biểu mẫu tải lên HTML để làm cho biểu mẫu trông đẹp mắt. Đó không phải là bất lợi vì nó không ảnh hưởng đến chức năng, nhưng có lẽ nó cũng sẽ cần một thời gian

Kịch bản này chỉ là phần nổi của tảng băng chìm. Có rất nhiều tác vụ khác liên quan đến quá trình tải lên tệp, chẳng hạn như phân phối tệp trên các máy chủ để phân phối tối ưu, xử lý hình ảnh (e. g. , cắt xén và các hiệu ứng khác), v.v.

Đoạn mã trên là một phiên bản rõ ràng và tinh tế hơn một chút của tập lệnh ví dụ mà bạn có thể tìm thấy với lời giải thích chi tiết hơn tại php. mạng, w3schools. com, và các trang web khác. Cái từ bài viết này đã được thử nghiệm và nó đã sẵn sàng hoạt động. Ngoài ra, nó bao gồm các bước kiểm tra cơ bản, vì điều quan trọng là không làm hỏng máy chủ của bạn khi cung cấp cho công chúng

Nếu bạn cần một giải pháp nhanh chóng, đáng tin cậy và mạnh mẽ để xử lý các hình ảnh tải lên của mình, chỉ cần gọi các hàm của Uploadcare từ các tập lệnh PHP của bạn. Nó sẽ mang lại cho bạn độ tin cậy cao hơn và quá trình tải lên sẽ được hoàn thành nhanh hơn

  • Thiết lập siêu nhanh và giao diện tùy biến
  • Hoạt động cho web và điện thoại di động
  • Quản lý lưu trữ và hoạt động với CDN tự động
  • Hỗ trợ kỹ thuật nếu bạn gặp sự cố
  • Các tính năng bổ sung, chẳng hạn như thay đổi kích thước, cắt xén hình ảnh, v.v.
  • Cho phép người dùng nhập tệp từ nhiều nguồn
  • Giao diện CSS có thể dễ dàng tùy chỉnh

  • Có thể không hoạt động đối với các quy trình tải lên rất cụ thể (API bao gồm các phương pháp bao gồm hầu hết tất cả các tác vụ liên quan đến tải lên hình ảnh)
  • Không hoạt động đối với các tệp lớn (100 MB trở lên, tùy thuộc vào gói của bạn)
  • Không thể có gói cài đặt tại chỗ đơn giản, vì vậy gói này có thể không hoạt động đối với các hệ thống có quyền truy cập Internet hạn chế
  • Dịch vụ này không miễn phí, nhưng nó cung cấp các gói phù hợp với nhu cầu và ngân sách của hầu hết các doanh nghiệp

Trên thực tế, bạn có thể truy cập các phương thức Uploadcare thông qua HTML/JS, vì vậy PHP hoàn toàn không cần thiết. Tuy nhiên, Uploadcare cung cấp cho bạn API có tài liệu đầy đủ mà bạn có thể sử dụng từ bên trong văn phòng hỗ trợ được viết bằng PHP của mình

Xem hướng dẫn rất chi tiết này về cài đặt thư viện Uploadcare qua Composer, nhận khóa API và chuyển đổi. Tải lên tệp không cần máy chủ trong PHP →

Sau khi hoàn tất, việc đưa hình ảnh của bạn lên máy chủ CDN bằng Uploadcare sẽ dễ dàng như vài dòng mã này

DOCTYPE html>
<html>
<head>
  <script>
    UPLOADCARE_PUBLIC_KEY = 'YOUR_PUBLIC_KEY';
  script>
   echo $api->widget->getScriptTag(); ?>
head>
<body>
<form method="POST" action="index.php">
   echo $api->widget->getInputTag('qs-file'); ?>
  <input type="submit" value="Save!" />
form>
body>
html>

Khi bạn khởi chạy mã này trong trình duyệt, bạn sẽ thấy tiện ích xuất hiện, nghĩa là bạn có thể tiếp tục và bắt đầu tải lên

Làm cách nào tôi có thể tải lên tệp PHP trực tuyến?
Xin chào thế giới ví dụ về tải lên tệp và hình ảnh PHP

Chúng tôi tại Uploadcare đã trải qua rất nhiều khó khăn với việc tải tệp lên. Cuối cùng, chúng tôi quyết định phải có một cách tốt hơn, vì vậy chúng tôi đã tạo ra một dịch vụ giúp bạn dễ dàng thực hiện

Nếu bạn không muốn công việc kinh doanh của mình bị đình trệ vì nhiệm vụ nhỏ nhưng cực kỳ phức tạp này, hãy thử Uploadcare ngay bây giờ. Tại sao phải đi bộ đến sân bay khi bạn có thể đi taxi?

Làm cách nào để tải tệp lên trên PHP?

Tải lên và xem tệp .
Trên điện thoại hoặc máy tính bảng Android của bạn, hãy mở ứng dụng Google Drive
Nhấn vào Thêm
Nhấn vào Tải lên
Tìm và nhấn vào các tệp bạn muốn tải lên
Xem các tệp đã tải lên trong Drive của tôi cho đến khi bạn di chuyển chúng

Tệp tải lên PHP ở đâu?

php lưu trữ tất cả các tệp tạm thời, bao gồm các tệp đã tải lên, trong thư mục tệp tạm thời như được chỉ định trong php. ini . Lưu ý rằng đối với các tệp tải lên, các tệp đó có thể bị xóa ngay khi tập lệnh mà tệp được tải lên bị chấm dứt (vì vậy trừ khi bạn trì hoãn tập lệnh đó, nếu không bạn có thể sẽ không thấy tệp đã tải lên).

Làm cách nào tôi có thể tải tệp lên trực tuyến?

Tải tệp và thư mục lên .
Trên máy tính của bạn, đi đến ổ đĩa. Google. com
Ở trên cùng bên trái, nhấp vào Mới. Tải lên tệp hoặc tải lên thư mục
Chọn tệp hoặc thư mục bạn muốn tải lên

Tải lên tệp trong PHP là gì?

Có thể sử dụng tập lệnh PHP với biểu mẫu HTML để cho phép người dùng tải tệp lên máy chủ . Ban đầu, các tệp được tải lên một thư mục tạm thời và sau đó được chuyển đến đích đích bằng tập lệnh PHP.