您的位置:首页 > 编程语言 > PHP开发

PHP上传文件设计分析

2015-06-13 20:53 513 查看
应用情景:手机APP的上传图片的功能,使用HTTP multipart/form-data 协议进行上传。

基础知识:

PHP中最重要的一个全局变量之一,$_FILES,在服务器端,记录了multipart/form-data 协议中的文件信息。multipart/form-data 协议其实和Post没啥大的区别,只不过它携带的参数的数据格式比较特殊,其中包含了文件的字节内容。文件通过HTTP传输到服务器之后,服务器作为一个HTTP服务器,会把这个文件的字节内容,暂存在PHP的临时文件夹里面,这个文件夹是PHP安装文件夹中的一个tmp命名的文件夹。需要注意的是,这只是暂存,默认的暂存时间,就是当当前的PHP脚本结束运行之后,这个临时文件便会消失,所以需要你在它消失之前,对其进行保存或者移动。

基本的过程是:

1、获取$_FILES中的文件信息,包括名称,暂存路径等,其中重要的信息有以下五个:

$_FILES["file"]["name"] - 被上传文件的名称
$_FILES["file"]["type"] - 被上传文件的类型
$_FILES["file"]["size"] - 被上传文件的大小,以字节计
$_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称
$_FILES["file"]["error"] - 由文件上传导致的错误代码

2、文件大小的限制判断,因为你不能任由用户上传任意大小的文件,因为很有可能你的服务器就一直在为这个连接服务,一直在为他传输文件,者不可行。尽管HTTP对报文长度大小没有做出任何限制,但是你的服务器程序,比如Apache,Nginx会对用户上传的文件大小做出限制,比如Apache默认应该是8M,这个大小你可以在相应的配置文件中进行修改。然而,你也可以在程序中进行检查,比如你希望用户上传的图片大小不超过3M,而上传的文本大小不超过1M,那么你就可以通过type和size这两个参数,进行判断,如果超过了规定的最大长度,就不做处理,直接返回错误代码。

3、保存文件或者移出暂存文件夹,php中有一个函数move_uploaded_file(name, path)可以移动上传文件至指定的path路径下。但是,目前大部分创业企业,都是用云服务器,而如果你使用云服务器自身带的数据盘,没有使用提供商提供的存储服务好处多,所以大部分都会使用提供商提供的服务来存储数据,所以这个函数在这种情况下就失去了作用。我的解决方案在下面会提到。

<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000))
{
if ($_FILES["file"]["error"] > 0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";

if (file_exists("upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " already exists. ";
}
else
{
move_uploaded_file($_FILES["file"]["tmp_name"],
"upload/" . $_FILES["file"]["name"]);
echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
}
}
}
else
{
echo "Invalid file";
}
?>


4.说一下我的解决方案吧,主要步骤如下:

1、判断类型是否符合要求和大小是否超出规定的最大文件长度

2、读取暂存文件内容,并且加载至Memcache或者Redis中进行缓存

3、返回图片的指纹,或者缓存中图片内容所对应的key,供下面的程序使用,缓存有暂存时间,如果不尽快使用图片内容会被销毁

4、用户在使用图片的时候,会首先将缓存中的图片保存至指定的云存储盘中(这里可以加一个适配层,适应不同的存储服务),然后生成缩略语,保存缩略图,存储文件信息

基本上就是以上几个要点
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: