Home  >  Article  >  Backend Development  >  Two ways to implement file upload in php

Two ways to implement file upload in php

墨辰丷
墨辰丷Original
2018-06-04 10:25:112090browse

This article mainly introduces two methods of php file upload in detail. Interested friends can refer to it

There are generally two ways to upload files:

Yes Two types:
1. Standard input form method, typically using $_FILES to receive;
2. Transmission in Base64 method, usually AJAX asynchronous upload.

The first
standard input form method is suitable for uploading large files and supports batches. Key sentences of html code:

<form enctype="multipart/form-data" method="post" action="upload.php"">
  <input type="file" name="id_pic[]" accept="image/*" class="form-control" multiple />
  <input type="submit" value="上传 " />
</form>

Different names:

<form enctype="multipart/form-data" method="post" action="upload.php"">
  <input type="file" name="id_pic_1" accept="image/*" class="form-control" />
  <input type="file" name="id_pic_2" accept="image/*" class="form-control" />
  <input type="submit" value="上传 " />
</form>

Among them, enctype="multipart/form-data" is essential for file upload. In addition, type="file" sets the input type, and accept="image/*" specifies priority in uploading images (MIME reference manual). Multiple supports selecting multiple files at one time, and pic[] receives multiple files in the form of an array. The mobile terminal can also add the parameter capture="camera" to select the camera to take pictures and upload them.

Backend processing:
Get the uploaded files through $_FILES.

$files = $_FILES;
When transferring multiple files, if the names are different, the format of the returned $_FILES array will be different.

When the names are the same:

array(1) {
 ["id_pic"] => array(5) {
  ["name"] => array(2) {
   [0] => string(5) "1.jpg"
   [1] => string(5) "2.jpg"
  }
  ["type"] => array(2) {
   [0] => string(10) "image/jpeg"
   [1] => string(10) "image/jpeg"
  }
  ["tmp_name"] => array(2) {
   [0] => string(27) "C:\Windows\Temp\php7A7E.tmp"
   [1] => string(27) "C:\Windows\Temp\php7A7F.tmp"
  }
  ["error"] => array(2) {
   [0] => int(0)
   [1] => int(0)
  }
  ["size"] => array(2) {
   [0] => int(77357)
   [1] => int(56720)
  }
 }
}

When the names are not the same:

   array(2) {
 ["id_pic_1"] => array(5) {
  ["name"] => string(5) "1.jpg"
  ["type"] => string(10) "image/jpeg"
  ["tmp_name"] => string(27) "C:\Windows\Temp\phpBBEE.tmp"
  ["error"] => int(0)
  ["size"] => int(77357)
 }
 ["id_pic_2"] => array(5) {
  ["name"] => string(5) "2.jpg"
  ["type"] => string(10) "image/jpeg"
  ["tmp_name"] => string(27) "C:\Windows\Temp\phpBBEF.tmp"
  ["error"] => int(0)
  ["size"] => int(56720)
 }
}

In the pair $ When _FILES performs foreach traversal, the previous output format is not very convenient. The latter can be traversed directly. We can write a method for unified conversion:

function dealFiles($files) {
    $fileArray = array();
    $n     = 0;
    foreach ($files as $key=>$file){
      if(is_array($file[&#39;name&#39;])) {
        $keys    =  array_keys($file);
        $count   =  count($file[&#39;name&#39;]);
        for ($i=0; $i<$count; $i++) {
          $fileArray[$n][&#39;key&#39;] = $key;
          foreach ($keys as $_key){
            $fileArray[$n][$_key] = $file[$_key][$i];
          }
          $n++;
        }
      }else{
        $fileArray = $files;
        break;
      }
    }
    return $fileArray;
 }

Okay, I talked about how the backend processes the received $_FILES array and converts it into a unified format. The next main tasks are:
1. Check whether the uploaded file is illegal;
2. Check whether the uploaded file exceeds the size;
3. Check whether the saved path exists and whether it is writable;
4. File renaming;

A very important function is used in the upload process: move_uploaded_file(filename, $destination) to perform file moving operations. Move $_FILES['id_pic']['tmp_name'] to the new path. Of course, before moving, you can use is_uploaded_file($_FILES['id_pic']['tmp_name']) to determine whether the file is uploaded normally.

Multiple file upload is a circular method using move_uploaded_file() multiple times to perform the move operation.

The second type
is mainly about uploading pictures.
Use the change event of the input to process the image (such as compression) with canvas, and then send the file stream to the backend via ajax.

The basic principle is to render the image through canvas, and then compress and save it into a base64 string through the toDataURL method (can be compiled into a jpg format image).

Back-end processing:
The back-end will eventually receive the base64 string sent by the front-end, and then process the string into an image. Specifically, please use the keyword base64 to image development language for Google|Baidu. There is a base64Len in the result generated by the front end, which is the length of the string, and the back end should check to confirm whether the submission is complete.

//php示例:
$img = base64_decode($_POST[&#39;img&#39;]);
$img = imagecreatefromstring($img);

Summary: The above is the entire content of this article, I hope it will be helpful to everyone's study.

Related recommendations:

phpMethods and simple analysis of connecting to oracle database

PHP packaging MSSql operation class and complete example analysis

phpCore steps and brief analysis of connecting to Oracle database

The above is the detailed content of Two ways to implement file upload in php. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn