在过去的几个月里,我一直在用 PHP 和 MySQL 构建一个事件推广网站,任何人都可以在该网站上注册并添加他们本地事件的详细信息以及我调整大小的海报。
就目前而言,我已经让整个过程在本地和托管服务上运行良好,但在网站上线之前我有几个关于我正在做的方式的问题。
这是我用来处理图片上传的函数代码。我在本节之前检查文件大小。
$extension = substr($filename, strpos($filename,'.'), strlen($filename)-1);
$filetypes = array('.jpg', '.jpeg', '.gif', '.bmp', '.png', '.JPG', '.PNG', '.JPEG', '.GIF', '.BMP');
if($_FILES['image']['error'] == 4){
$error = "No image";
return $error;
}
else if(($_FILES['image']['error'] == 2) || ($_FILES['image']['error'] == 1)){
$error = "File size too big";
return $error;
}
else if(!in_array($extension, $filetypes)){
$error = "This isn't an image that is supported";
return $error;
}
else if(($_FILES['image']['error'] == 7) || ($_FILES['image']['error'] == 3)){
$error = "Error occurred. Try again";
return $error;
}
else{
if(($extension == '.jpg') || ($extension == '.jpeg')){
$source = imagecreatefromjpeg($uploaded);
}
else if($extension == '.png'){
$source = imagecreatefrompng($uploaded);
}
else{
$source = imagecreatefromgif($uploaded);
}
list($width, $height) = getimagesize($uploaded);
$ratio = $width / $height;
$new_width = 300;
$new_height = round(300 / $ratio);
$canvas = imagecreatetruecolor($new_width, $new_height);
imagecopyresampled($canvas, $source, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
$name = date("dmyHis").rand(0, 9);
$path = $_SERVER[ 'DOCUMENT_ROOT' ] . '/images/uploaded/'.$name.'.jpg';
$new_image = imagejpeg($canvas, $path, 100);
$poster['name'] = $name.'.jpg';
$poster['width'] = $new_width;
$poster['height'] = $new_height;
return $name.'.jpg';
}
就目前而言,有一些我知道的错误,或者还没有完全研究过,例如一些图像从 imagecreatefromwhatever 中抛出错误,以及图像名称是否带有“.”。在其中,它也会抛出一个错误。
完成该过程后,我会将图像名称保存到 MySQL 的“海报”字段中,用于在查看时从文件夹中获取正确的图像。
我真正想知道的是,在上传图片时我是否可能遇到任何其他问题?
- 我预计会有相当大的流量,那么这段代码是否可以在大量使用的情况下正常运行?
- 还有其他任何陷阱或我应该注意的事情吗?
- 我是否使用了完成工作的最佳方法?
- 目前我的文件大小限制是 2MB,这会不会太大了?
- 即使用户上传超过 2MB 的内容,脚本仍会运行,我假设文件将上传到服务器以进行名称剥离和文件大小比较等,这将如何影响我的带宽使用?
- 原始文件在服务器上保留多长时间?
如果有人对这个主题有任何好的阅读,我将不胜感激!
谢谢。
编辑:格式化。
编辑 2:我没有弄清楚原始文件。我的意思是我使用 $_FILES 变量访问的原始文件。假设它是 1.9MB,在我摆弄扩展的整个过程中,服务器上是否会有 1.9MB 的图像?我是否应该在创建新图像后清除它?
最佳答案
Rich,我做过类似的,主要是用 iMagick。 GD 在功能上是相似的,所以我预计不会有问题。我的网站每周可以毫无问题地处理一百张图片,并且可靠地提供约 1k/周的服务。我在后端完成了所有处理,就像您在此示例中所做的那样,因此无需担心大量入站流量(例如 DIGG 上的皮卡)会压垮您的服务器。
最大的挑战是您通过允许任何类型的上传而使自己面临漏洞。您可能听过 IT 安全人员说,防止黑客攻击的唯一方法是离开网络……有点像。我不会生活在完全的恐惧中,因为看起来您已经采取了公平的步骤来审核文件类型和大小。另一个考虑因素是查看服务器上的权限——打开目录时只写入服务器的用户代理并阻止浏览目录以获得额外的安全性。如果你想要双重安全,请写到不同的帐户(如果你有这样的可用帐户)以限制对你的代码的暴露。这不是必需的,但如果您有顾虑,这是一个很好的额外步骤。最后,将您的上传者放在一个带有验证码的简单密码系统后面,以阻止自动利用检查程序……通过简单的注册步骤为用户提供免费访问权限。这是一个小的 UI 麻烦,但可以在安全方面产生重大影响。
如果用户文件超过 2mb 限制,我可能会考虑停止进程。这就是我。如果某些用户试图在您的服务器上强制使用文件扩展名为 .jpg 的错误文件,您不希望系统崩溃和烧毁。如果您自己托管或按兆付费,带宽可能只是一个问题——当然,这会增加您的带宽,但即使每天上传一百次,您也可能不会插入标准服务器超出其能力,除非访问该站点的相应流量为数以千计。大多数主机将允许您监控服务器负载。我个人在 HostGator 上以低廉的价格获得了好运
文件会无限期地保留在服务器上,前提是您的帐户没有发生任何不良情况并且您支付了账单。出于这个原因,请确保将您的上传文件夹与任何其他内容的文件夹分开——一旦上传了几百个文件,它就会变成一场噩梦。经常备份,只是为了安全。
关于php - 使用 PHP 上传图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3277180/