首页 后端开发 php教程 phpmaster |使用PHP上传文件

phpmaster |使用PHP上传文件

Mar 03, 2025 am 08:28 AM

phpmaster | Uploading Files with PHP

PHP 文件上传:构建安全可靠的上传系统

在线相册图片、邮件附件以及批量处理应用的数据文件,它们有一个共同点:都需要通过用户的网页浏览器将文件上传到互联网。文件上传功能是许多日常使用的网站和网络应用程序的重要组成部分。本文将向您展示如何使用 PHP 为您的网站添加文件上传支持。

关键要点

  • 在 PHP 中添加文件上传支持需要创建一个供用户使用的 HTML 表单和一个用于处理服务器上上传文件的 PHP 脚本。<form></form> 元素必须使用 POST 方法,并将 enctype 属性设置为 multipart/form-data。
  • 上传的文件首先存储在临时目录中。负责处理表单提交的 PHP 脚本会验证文件并进行处理,通常会将其从临时位置移动到更永久的位置。
  • 有关文件上传的信息通过多维数组 $_FILES 提供。move_uploaded_file() 函数将上传的文件从临时位置移动到永久位置,并执行额外的检查以确保文件确实是通过 HTTP POST 请求上传的。
  • 允许文件上传存在安全风险。为了减轻这些风险,可以验证上传文件的类型,对上传流量施加严格限制,并扫描病毒。通过用下划线替换任何非字母、数字或一组非常有限的标点符号的字符,确保安全的文件名也很重要。

先决条件

处理文件上传并不困难,但是有一些小的细节必须正确,否则上传将会失败。首先,您需要确保 PHP 配置为允许上传。检查您的 php.ini 文件并验证 file_uploads 指令是否设置为 On。

<code>file_uploads = On</code>

上传的文件首先存储在临时目录中(别担心……您的 PHP 脚本之后可以将文件移动到更永久的位置)。默认情况下,初始位置是系统的默认临时目录。您可以使用 php.ini 中的 upload_tmp_dir 指令指定不同的目录。无论如何,您应该验证 PHP 进程是否具有写入所用目录的适当权限。

<code>upload_tmp_dir = "/tmp"

tboronczyk@zarkov:~$ ls -l / | grep tmp
drwxrwxrwt  13 root root 40960 2011-08-31 00:50 tmp</code>

确定配置允许服务器接受上传的文件后,您可以将注意力集中在 HTML 细节上。与大多数来自 HTML 的其他服务器端交互一样,上传文件使用表单。您的 <form></form> 元素必须使用 POST 方法并将 enctype 属性设置为 multipart/form-data,这一点非常重要。


编写上传过程脚本

根据您自己的经验和刚才提到的要求检查,您可能已经猜到了文件上传的流程。

  • 访问者查看包含专门用于支持文件上传的表单的 HTML 页面。
  • 访问者提供他想要上传的文件并提交表单。
  • 浏览器对文件进行编码,并将其作为对服务器发出的 POST 请求的一部分发送。
  • PHP 接收表单提交,解码文件并将其保存在服务器上的临时位置。
  • 负责处理表单提交的 PHP 脚本验证文件并以某种方式处理它,通常将其从临时位置移动到更永久的位置。

添加文件上传支持需要您创建一个要呈现给用户的 HTML 表单和一个用于处理服务器上上传文件的 PHP 脚本。

HTML

HTML 表单提供用户启动文件上传的界面。请记住,<input> 元素的 method 属性必须设置为 post,enctype 属性必须设置为 multipart/form-data。一个文件 <input> 元素提供一个用于指定将要上传的文件的字段。像任何其他表单元素一样,提供 name 属性非常重要,以便您可以在处理表单的 PHP 脚本中引用它。以下是基本文件上传表单的标记示例:

<code>file_uploads = On</code>

值得注意的是,不同的浏览器会以不同的方式呈现文件字段。IE、Firefox 和 Opera 将其显示为带有旁边标记为“浏览”或“选择”的按钮的文本字段。Safari 将其呈现为仅标记为“选择文件”的按钮。这通常不是问题,因为用户习惯了该字段在其选择的浏览器中的呈现方式,并且知道如何使用它。但是,有时您会遇到坚持以某种方式呈现它的客户端或设计师。由于浏览器施加的安全原因,可以应用于文件字段的 CSS 和 JavaScript 的数量非常有限。样式化文件字段可能很困难。如果外观对您很重要,我建议您查看 Peter-Paul Koch 的《样式化 input type="file"》。

PHP

有关文件上传的信息通过多维数组 $_FILES 提供。此数组按分配给 HTML 表单中文件字段的名称进行索引,就像 $_GET$_POST 按名称进行索引一样。然后,每个文件的数组包含以下索引:

  • $_FILES["myFile"]["name"] 存储来自客户端的原始文件名。
  • $_FILES["myFile"]["type"] 存储文件的 MIME 类型。
  • $_FILES["myFile"]["size"] 存储文件的大小(以字节为单位)。
  • $_FILES["myFile"]["tmp_name"] 存储临时文件的名称。
  • $_FILES["myFile"]["error"] 存储传输过程中产生的任何错误代码。

move_uploaded_file() 函数将上传的文件从临时位置移动到永久位置。您应该始终为此目的使用 move_uploaded_file() 而不是 copy()rename() 等函数,因为它会执行额外的检查以确保文件确实是通过 HTTP POST 请求上传的。如果您计划使用用户提供的原始文件名保存文件,最好确保这样做是安全的。文件名不应包含任何可能影响目标路径的字符,例如斜杠。名称也不应该导致文件覆盖同名的现有文件(除非您的应用程序设计就是这么做的)。我通过用下划线替换任何非字母、数字或一组非常有限的标点符号的字符,然后在同名文件已存在时附加递增的数字来确保安全的文件名。以下是接收和处理 PHP 文件上传的示例:

<code>file_uploads = On</code>

这段代码首先确保文件上传没有错误。然后,它确定安全的文件名(如我刚才所述),然后使用 move_uploaded_file() 将文件移动到其最终目录。最后,调用 chmod() 以确保在新文件上设置了合理的访问权限。

安全注意事项

我们大多数人都不会让完全陌生的人在我们的个人电脑上存储随机文件,但当您允许在我们的应用程序中上传文件时,您实际上就是在做这件事。您可能打算让用户上传自己的照片作为个人资料页面,但如果他试图上传特别制作的、带有病毒的可执行文件怎么办?我想分享一些您可以采取的步骤,以最大限度地减少允许文件上传固有的安全风险。其中一个步骤是验证上传文件的类型是否正确。依赖 $_FILES["myFile"]["type"] 的值或文件名的扩展名是不安全的,因为两者都容易被伪造。相反,使用 exif_imagetype() 等函数检查文件的内容并确定它是否确实是 GIF、JPEG 或其他几种受支持的图像格式。如果 exif_imagetype() 不可用(该函数需要启用 Exif 扩展),则可以使用 getimagesize()getimagesize() 返回的数组将包含图像类型(如果识别)。

<code>upload_tmp_dir = "/tmp"

tboronczyk@zarkov:~$ ls -l / | grep tmp
drwxrwxrwt  13 root root 40960 2011-08-31 00:50 tmp</code>

对于非图像文件,您可以使用 exec() 来调用 unix file 实用程序。file 通过查找预期位置中的已知二进制签名来确定文件的类型。

<code>file_uploads = On</code>

您可以采取的另一个步骤是对 POST 请求的总大小和可以上传的文件数量施加严格限制。为此,请在 php.ini 中为 upload_max_size、post_max_size 和 max_file_uploads 指令指定适当的值。upload_max_size 指令指定文件上传的最大大小。除了上传的大小之外,您还可以使用 post_max_size 指令限制整个 POST 请求的大小。max_file_uploads 是一个较新的指令(在 5.2.12 版本中添加),它限制了文件上传的数量。这三个指令有助于保护您的网站免受试图通过造成大量网络流量或系统负载来破坏其可用性的攻击。

<code>upload_tmp_dir = "/tmp"

tboronczyk@zarkov:~$ ls -l / | grep tmp
drwxrwxrwt  13 root root 40960 2011-08-31 00:50 tmp</code>

您可以采取的第三个步骤是用病毒扫描程序扫描上传的文件。在当今病毒和恶意软件广泛传播的时代,这至关重要,尤其是在您的网站稍后允许其他个人下载上传的文件时,例如在基于 Web 的电子邮件客户端或(合法)文件共享网站中的附件。有一个 PHP 扩展程序可以访问 ClamAV,但是,当然,您可以像我为 file 演示的那样调用 ClamAV 的命令行实用程序。


总结

您已经了解了使用您的网站或基于 Web 的应用程序支持文件上传是多么容易。为了使上传成功,HTML 表单必须通过 multipart/form-data 编码的 POST 请求提交,并且 PHP 必须允许使用 file_uploads 指令指定的传输。文件传输后,负责处理上传的脚本使用在 $_FILES 数组中找到的信息将文件从临时目录移动到所需位置。我还分享了一些额外的预防措施,您可以采取这些措施来保护您自己和您的用户免受与允许文件上传相关的一些风险。您看到了如何确保文件名安全、验证文件类型、对上传流量施加严格限制以及扫描病毒。

(后续内容,例如常见问题解答部分,可以根据需要添加)

以上是phpmaster |使用PHP上传文件的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

我如何了解最新的PHP开发和最佳实践? 我如何了解最新的PHP开发和最佳实践? Jun 23, 2025 am 12:56 AM

TostaycurrentwithPHPdevelopmentsandbestpractices,followkeynewssourceslikePHP.netandPHPWeekly,engagewithcommunitiesonforumsandconferences,keeptoolingupdatedandgraduallyadoptnewfeatures,andreadorcontributetoopensourceprojects.First,followreliablesource

什么是PHP,为什么它用于Web开发? 什么是PHP,为什么它用于Web开发? Jun 23, 2025 am 12:55 AM

PHPbecamepopularforwebdevelopmentduetoitseaseoflearning,seamlessintegrationwithHTML,widespreadhostingsupport,andalargeecosystemincludingframeworkslikeLaravelandCMSplatformslikeWordPress.Itexcelsinhandlingformsubmissions,managingusersessions,interacti

如何设置PHP时区? 如何设置PHP时区? Jun 25, 2025 am 01:00 AM

tosetTherightTimeZoneInphp,restate_default_timezone_set()functionAtthestArtofyourscriptWithavalIdidentIdentifiersuchas'america/new_york'.1.usedate_default_default_timezone_set_set()

我如何验证PHP中的用户输入以确保其符合某些标准? 我如何验证PHP中的用户输入以确保其符合某些标准? Jun 22, 2025 am 01:00 AM

TovalidateuserinputinPHP,usebuilt-invalidationfunctionslikefilter_var()andfilter_input(),applyregularexpressionsforcustomformatssuchasusernamesorphonenumbers,checkdatatypesfornumericvalueslikeageorprice,setlengthlimitsandtrimwhitespacetopreventlayout

编写清洁和可维护的PHP代码的最佳实践是什么? 编写清洁和可维护的PHP代码的最佳实践是什么? Jun 24, 2025 am 12:53 AM

写干净、易维护的PHP代码关键在于清晰命名、遵循标准、合理结构、善用注释和可测试性。1.使用明确的变量、函数和类名,如$userData和calculateTotalPrice();2.遵循PSR-12标准统一代码风格;3.按职责拆分代码结构,使用MVC或Laravel式目录组织;4.避免面条式代码,将逻辑拆分为单一职责的小函数;5.在关键处添加注释并撰写接口文档,明确参数、返回值和异常;6.提高可测试性,采用依赖注入、减少全局状态和静态方法。这些做法提升代码质量、协作效率和后期维护便利性。

什么是php(serialize(),Unserialize())中的数据序列化? 什么是php(serialize(),Unserialize())中的数据序列化? Jun 22, 2025 am 01:03 AM

thephpfunctionserize()andunSerialize()redustoconvertComplexdatStructDestoresToroStoroStoroSandaBackagagain.1.Serialize()

如何将PHP代码嵌入HTML文件中? 如何将PHP代码嵌入HTML文件中? Jun 22, 2025 am 01:00 AM

可以将PHP代码嵌入HTML文件中,但需确保文件以.php为扩展名,以便服务器能正确解析。使用标准的标签包裹PHP代码,可在HTML中任意位置插入动态内容。此外,可在同一文件中多次切换PHP与HTML,实现条件渲染等动态功能。务必注意服务器配置及语法正确性,避免因短标签、引号错误或遗漏结束标签导致问题。

如何使用PHP执行SQL查询? 如何使用PHP执行SQL查询? Jun 24, 2025 am 12:54 AM

Yes,youcanrunSQLqueriesusingPHP,andtheprocessinvolveschoosingadatabaseextension,connectingtothedatabase,executingqueriessafely,andclosingconnectionswhendone.Todothis,firstchoosebetweenMySQLiorPDO,withPDObeingmoreflexibleduetosupportingmultipledatabas

See all articles