PHP上传原理及操作实现,php上传原理
关于PHP上传文件的函数类库,网上有许多封装很完善,大家直接拿来用就可以。
本文章只是说下关于上传原理和简单的上传操作,老鸟就无视了哈^_^~
还有一些安全性判断比如:服务端限制能接收图片类型的文件,而客户端恶意将病毒文件的后缀名改为图片配型的文件上传。
(举例单文件上传,多文件原理还是不变,只不过多了点小技巧)
1、Form标签enctype属性 表单中enctype="multipart/form-data"是用于设置表单的MIME编码。 2、MAX_FILE_SIZE 隐藏字段 MAX_FILE_SIZE 隐藏字段(单位为字节)必须放在文件输入字段之前,其值为接收文件的最大尺寸。这是对浏览器的一个建议,PHP 也会检查此项。 upload.php 我们可以看到: 3、全局变量 $_FILES的应用 $_FILES['file']['name'] 为上传文件的原文件名 $_FILES['file']['type'] 为上传文件的 MIME 类型 $_FILES['file']['size'] 已上传文件的大小,单位为字节 $_FILES['file']['tmp_name'] 文件被上传后在服务端储存的临时文件名() $_FILES['file']['error'] 文件上传的错误代码 4、默认情况下,上传文件会保存在服务端的临时文件夹中,其目录在php.ini中设置 php.ini与文件上传有关的一些常用设置: file_uploads ; 是否允许通过HTTP上传文件的开关。默认为ON即是开 upload_tmp_dir ; 文件上传至服务器上存储临时文件的地方,如果没指定就会用系统默认的临时文件夹 upload_max_filesize; 即允许上传文件大小的最大值。默认为2M post_max_size; 指通过表单POST给PHP的所能接收的最大值,包括表单里的所有值。默认为8M 下面是对单文件上传的完整代码,因为是随想随写的,可能逻辑嵌套的有点乱,懂原理最重要。 5、关于php上传文件的一些常用函数:(具体用法就不贴出来了,自己看API文档吧 ^_^) file_exists 检查文件或目录是否存在 is_uploaded_file 判断文件是否是通过 HTTP POST 上传的 move_uploaded_file 将上传的文件移动到新位置 is_writable 判断给定的文件名是否可写 iconv 字符编码互转 str_replace 字符串替换(更改文件名,防重名) getimagesize 检查是否为图片文件(其他类型的文件就算后缀名改了也能被检测到)
分别实现的是实现登录日志和操作日志,自定义2个函数数,在用户登录和增加,修改和删除的时候分别DO这两个函数。信息就记录到数据库表中。 不用这么麻烦,jquery有很多插件就可以实现上传文件进度的样式,可以使用下 DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
head>
meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
title>upload filestitle>
head>
body>
form action="upload.php" enctype="multipart/form-data" method="post">
input type="hidden" name="MAX_FILE_SIZE" value="10000" />
上传文件:input type="file" name="file"/>
input type="submit" value="上传" />
form>
body>
html>
默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;
只有使用了multipart/form-data且提交方式为Post才能完整的传递文件数据。
在浏览器端可以简单绕过此设置,因此不要指望用此特性来阻挡大文件。(不过鉴于友好性最好还是在表单中加上此项目,因为它可以避免用户在花时间等待上传大文件之后才发现文件过大上传失败的麻烦。)<?<span>php
</span><span>print_r</span>(<span>$_FILES</span><span>);
</span>?>
<span>Array</span><span>
(
[</span><span>file</span>] => <span>Array</span><span>
(
[name] </span>=> 照片文件.<span>jpg
[type] </span>=> image/<span>jpeg
[tmp_name] </span>=> F:\wamp\tmp\php41BB.<span>tmp
[error] </span>=> 0<span>
[size] </span>=> 73886<span>
)
)</span>
<?<span>php
</span><span>//</span><span>取得上传文件信息</span>
<span>$fileName</span>=<span>$_FILES</span>['file']['name'<span>];
</span><span>$fileType</span>=<span>$_FILES</span>['file']['type'<span>];
</span><span>$fileError</span>=<span>$_FILES</span>['file']['error'<span>];
</span><span>$fileSize</span>=<span>$_FILES</span>['file']['size'<span>];
</span><span>$tempName</span>=<span>$_FILES</span>['file']['tmp_name'];<span>//</span><span>临时文件名
//定义上传文件类型</span>
<span>$typeList</span> = <span>array</span>("image/jpeg","image/jpg","image/png","image/gif"); <span>//</span><span>定义允许的类型</span>
<span>if</span>(<span>$fileError</span>>0<span>){
</span><span>//</span><span>上传文件错误编号判断</span>
<span>switch</span> (<span>$fileError</span><span>) {
</span><span>case</span> 1:
<span>$message</span>="上传的文件超过了php.ini 中 upload_max_filesize 选项限制的值。"<span>;
</span><span>break</span><span>;
</span><span>case</span> 2:
<span>$message</span>="上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。"<span>;
</span><span>break</span><span>;
</span><span>case</span> 3:
<span>$message</span>="文件只有部分被上传。"<span>;
</span><span>break</span><span>;
</span><span>case</span> 4:
<span>$message</span>="没有文件被上传。"<span>;
</span><span>break</span><span>;
</span><span>case</span> 6:
<span>$message</span>="找不到临时文件夹。"<span>;
</span><span>break</span><span>;
</span><span>case</span> 7:
<span>$message</span>="文件写入失败"<span>;
</span><span>break</span><span>;
</span><span>case</span> 8:
<span>$message</span>="由于PHP的扩展程序中断了文件上传"<span>;
</span><span>break</span><span>;
}
</span><span>exit</span>("文件上传失败:".<span>$message</span><span>);
}
</span><span>if</span>(!<span>is_uploaded_file</span>(<span>$tempName</span><span>)){
</span><span>//</span><span>判断是否是POST上传过来的文件</span>
<span>exit</span>("不是通过HTTP POST方式上传上来的"<span>);
}</span><span>else</span><span>{
</span><span>if</span>(!<span>in_array</span>(<span>$fileType</span>, <span>$typeList</span><span>)){
</span><span>exit</span>("上传的文件不是指定类型"<span>);
}</span><span>else</span><span>{
</span><span>if</span>(!<span>getimagesize</span>(<span>$tempName</span><span>)){
</span><span>//</span><span>避免用户上传恶意文件,如把病毒文件扩展名改为图片格式</span>
<span>exit</span>("上传的文件不是图片"<span>);
}
}
</span><span>if</span>(<span>$fileSize</span>>100000<span>){
</span><span>//</span><span>对特定表单的上传文件限制大小</span>
<span>exit</span>("上传文件超出限制大小"<span>);
}</span><span>else</span><span>{
</span><span>//</span><span>避免上传文件的中文名乱码</span>
<span>$fileName</span>=<span>iconv</span>("UTF-8", "GBK", <span>$fileName</span>);<span>//</span><span>把iconv抓取到的字符编码从utf-8转为gbk输出</span>
<span>$fileName</span>=<span>str_replace</span>(".", <span>time</span>().".", <span>$fileName</span>);<span>//</span><span>在图片名称后加入时间戳,避免重名文件覆盖</span>
<span>if</span>(<span>move_uploaded_file</span>(<span>$tempName</span>, "uploads/".<span>$fileName</span><span>)){
</span><span>echo</span> "上传文件成功!"<span>;
}</span><span>else</span><span>{
</span><span>echo</span> "上传文件失败"<span>;
}
}
}
</span>?>
ps:既然你这么个性,我就给你说说实现的原理,具体细节你自己去弄吧.
普通的页面访问全是同步的,就是 请求-->反馈,而进度条需要的实时的数据,所以普通页面是实现不了这个功能的,得需要借助异步ajax周期获取进度数据,这个数据的来源当然就是服务器端发送的了,这样就遇到了一个严重的问题,php获取不了文件传送过程中的状态.幸好,php的创始人写了一个APC扩展(另外一个扩展是uploadprogress),利用扩展的语法,加上ajax,使用js操作页面的dom对象,就实现了进度条.
你明白了原理,你也很难做出来,哎.

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP不是在消亡,而是在不斷適應和進化。 1)PHP從1994年起經歷多次版本迭代,適應新技術趨勢。 2)目前廣泛應用於電子商務、內容管理系統等領域。 3)PHP8引入JIT編譯器等功能,提升性能和現代化。 4)使用OPcache和遵循PSR-12標準可優化性能和代碼質量。

PHP的未來將通過適應新技術趨勢和引入創新特性來實現:1)適應云計算、容器化和微服務架構,支持Docker和Kubernetes;2)引入JIT編譯器和枚舉類型,提升性能和數據處理效率;3)持續優化性能和推廣最佳實踐。

在PHP中,trait適用於需要方法復用但不適合使用繼承的情況。 1)trait允許在類中復用方法,避免多重繼承複雜性。 2)使用trait時需注意方法衝突,可通過insteadof和as關鍵字解決。 3)應避免過度使用trait,保持其單一職責,以優化性能和提高代碼可維護性。

依賴注入容器(DIC)是一種管理和提供對象依賴關係的工具,用於PHP項目中。 DIC的主要好處包括:1.解耦,使組件獨立,代碼易維護和測試;2.靈活性,易替換或修改依賴關係;3.可測試性,方便注入mock對象進行單元測試。

SplFixedArray在PHP中是一種固定大小的數組,適用於需要高性能和低內存使用量的場景。 1)它在創建時需指定大小,避免動態調整帶來的開銷。 2)基於C語言數組,直接操作內存,訪問速度快。 3)適合大規模數據處理和內存敏感環境,但需謹慎使用,因其大小固定。

PHP通過$\_FILES變量處理文件上傳,確保安全性的方法包括:1.檢查上傳錯誤,2.驗證文件類型和大小,3.防止文件覆蓋,4.移動文件到永久存儲位置。

JavaScript中處理空值可以使用NullCoalescingOperator(??)和NullCoalescingAssignmentOperator(??=)。 1.??返回第一個非null或非undefined的操作數。 2.??=將變量賦值為右操作數的值,但前提是該變量為null或undefined。這些操作符簡化了代碼邏輯,提高了可讀性和性能。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

禪工作室 13.0.1
強大的PHP整合開發環境

Atom編輯器mac版下載
最受歡迎的的開源編輯器

Dreamweaver CS6
視覺化網頁開發工具

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能