使用PHP上传图像
在过去的几个月里,我一直在用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的价值吗?一旦我创建了新图像,我应该清除这个吗?
没有找到相关结果
已邀请:
4 个回复
砷竣阿
exif类型作为常量返回,如IMAGETYPE_GIF,其中数字,1是gif,2是jpg,3是png。您可以使用image_type_to_extension转换为文本文件扩展名。 现在,有时我发现getimagesize无法为有效的图像找到exif类型,并且可以使用imagemagick / GD进行处理。它没有为这些返回EXIF,因此被错误地拒绝了。我想出了这个卑鄙的黑客,至少要检测出类型并试一试......
骨酚柯
屡倒雷图
的所有东西都当作现在的延伸。因此,当有人在文件名中放入
时出错。这可以做得更好。
将为您提供小写的扩展名,不带点,这意味着您不必测试JPG以及jpg等(实际上,在上传浏览器时会告诉您文件类型,无论扩展名如何,但是我们暂时跳过它 - 扩展测试会很好) 图像读数,
并不是很干净:你也应该测试gif,然后再转到“else”类别,然后抛出一个错误。 (这意味着你可以放弃之前的支票!) 当你说
时你最好用@来预先设置它以避免在损坏的图像上发出警告(通常,不要使用@,但在这种情况下你无法知道图像是否已损坏)。然后总是检查返回值(总是这样做),比如
图像现在已加载,因此大小如果已知;您不必再次查询该文件。而不是
你可以使用
和
我认为这足以解决现在的问题。 ;-) 编辑:在文件名中使用rand(0,9)的小问题btw意味着如果多个客户端在同一秒内上传,则文件混乱的可能性很大。 (每秒上传11次你肯定有问题)
磁辫覆氓