php中上传的类怎么写
时间 : 2023-04-26 16:24:01声明: : 文章内容来自网络,不保证准确性,请自行甄别信息有效性

在PHP中,文件上传可以通过HTTP协议中的POST方法来完成。PHP提供了一些内置函数和类,用于处理文件上传。在本文中,我们将介绍如何使用PHP来编写一个简单的文件上传类。

1. 创建上传表单

首先,我们需要为用户提供一个表单,使他们可以选择要上传的文件。表单应该使用POST方法,并且其enctype属性应该设置为“multipart/form-data”。以下是一个示例表单:

<form method="post" action="upload.php" enctype="multipart/form-data">

<input type="file" name="fileToUpload">

<input type="submit" name="submit" value="Upload File">

</form>

2. 定义上传类

我们需要为文件上传创建一个类。该类将包含处理文件上传的方法。我们定义一个名为“Uploader”的类,如下所示:

class Uploader {

// 上传目录

private $targetDirectory;

function __construct($targetDirectory) {

$this->targetDirectory = $targetDirectory;

}

function upload($fileInputName) {

// 处理上传的文件

}

}

3. 处理上传的文件

现在,我们需要编写上传方法,处理上传的文件并将其保存到目标目录中。以下是一个简单的文件上传方法,它将上传的文件移动到目标目录中:

function upload($fileInputName) {

// 获取上传的文件信息

$fileName = $_FILES[$fileInputName]["name"];

$fileSize = $_FILES[$fileInputName]["size"];

$fileTmpName = $_FILES[$fileInputName]["tmp_name"];

$fileType = $_FILES[$fileInputName]["type"];

$fileError = $_FILES[$fileInputName]["error"];

// 拼接完整的文件路径

$targetFile = $this->targetDirectory . basename($fileName);

// 检查文件是否已经存在

if (file_exists($targetFile)) {

echo "The file already exists.";

return false;

}

// 移动上传的文件

if (move_uploaded_file($fileTmpName, $targetFile)) {

echo "The file ". basename($fileName). " has been uploaded.";

return true;

} else {

echo "Sorry, there was an error uploading your file.";

return false;

}

}

4. 实例化Uploader类

现在,我们可以在上传文件的页面中实例化Uploader类。我们将使用上传表单中的文件输入名称和目标目录来创建一个Uploader对象,并调用其upload方法。以下是一个示例:

$targetDirectory = "uploads/";

$uploader = new Uploader($targetDirectory);

if (isset($_POST["submit"])) {

$uploader->upload("fileToUpload");

}

这就是如何用PHP编写一个简单的文件上传类。注意,这只是一个起点,您可以扩展该类以便它符合您的特定需求。

在PHP中实现文件上传功能,需要使用到PHP的核心函数库:file_upload、$_FILES、move_uploaded_file等等。但是直接使用这些函数需要编写很多的代码,为了方便开发,我们可以使用类对文件上传进行封装,下面是一个简单的文件上传类的实现:

```php

class FileUploader {

private $uploadDir = './uploads'; //文件存放目录

private $allowedTypes = array('image/jpeg', 'image/png', 'image/gif'); //允许的文件类型集合

private $maxSize = 1024000; //上传文件的大小限制,单位为字节

private $fileName; //文件名

private $fileType; //文件类型

private $fileSize; //文件大小

private $tmpFile; //上传的临时文件

public function __construct($fileName) {

if (!isset($_FILES[$fileName])) {

throw new Exception('文件不存在');

}

$this->fileName = $_FILES[$fileName]['name'];

$this->fileType = $_FILES[$fileName]['type'];

$this->fileSize = $_FILES[$fileName]['size'];

$this->tmpFile = $_FILES[$fileName]['tmp_name'];

}

/**

* 获取文件名

*/

public function getFileName() {

return $this->fileName;

}

/**

* 获取文件类型

*/

public function getFileType() {

return $this->fileType;

}

/**

* 获取文件大小

*/

public function getFileSize() {

return $this->fileSize;

}

/**

* 获取上传的临时文件

*/

public function getTempFile() {

return $this->tmpFile;

}

/**

* 设置文件存放目录

*/

public function setUploadDir($dir) {

$this->uploadDir = $dir;

}

/**

* 设置允许的文件类型

*/

public function setAllowedTypes($types) {

$this->allowedTypes = $types;

}

/**

* 设置上传文件的大小限制,单位为字节

*/

public function setMaxSize($size) {

$this->maxSize = $size;

}

/**

* 执行文件上传操作

*/

public function upload() {

// 判断文件目录是否存在,如果不存在则创建

if (!file_exists($this->uploadDir)) {

mkdir($this->uploadDir);

}

// 判断文件类型是否合法

if (!in_array($this->fileType, $this->allowedTypes)) {

throw new Exception("不支持的文件类型:{$this->fileType}");

}

// 判断文件大小是否超过限制

if ($this->fileSize > $this->maxSize) {

throw new Exception("文件过大,最大支持{$this->maxSize}字节");

}

// 文件名处理

$fileExtension = strtolower(substr(strrchr($this->fileName, '.'), 1)); //文件后缀名

$fileName = str_replace('.', '', microtime(true)) . '.' . $fileExtension; //重命名文件名

$filePath = $this->uploadDir . '/' . $fileName;

// 移动上传文件到指定目录

if (move_uploaded_file($this->tmpFile, $filePath)) {

return $filePath;

} else {

throw new Exception("文件上传失败");

}

}

}

上述类中,我们定义了若干私有属性,包括上传文件的存放目录、允许的文件类型、上传文件的大小限制、文件名、文件类型、文件大小、上传的临时文件等等,同时也定义了若干公有方法,包括获取文件名、获取文件类型、获取文件大小、获取上传的临时文件等等。在使用该类时,只需要简单地实例化一个类对象,然后通过调用其upload方法进行文件上传即可,该方法内部会自动进行文件大小、类型、重命名等的处理。

当然,上述代码只是一个简单的示例,在实际开发中,我们还需要考虑文件安全等问题,并且应该根据项目实际需要进行调整。