過去幾個月,我一直在使用PHP和MySQL構建活動推廣網站,任何人都可以註冊並添加其本地活動的詳細信息以及調整大小的海報。使用PHP上傳圖片
既然這樣,我已經得到了全過程的工作在本地和託管服務優良,但該網站上線之前,我有一對夫婦對我做的方式問題。
這是我用來處理圖片上傳的功能代碼。我在本節之前檢查文件大小。
$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的圖像位於服務器上?我是否應該在創建新圖像後清除此問題?
我不認爲文件名可能不好。感謝關於getimagesize的提示。 至於圖像通道,我不知道CYMK會造成麻煩。 非常有用的信息,謝謝! – chudley 2010-07-18 21:52:38
文件類型的好處。一個有趣的PHP怪癖是,你可以說'imagecreatefromstring()',然後你不必知道類型 - 相當奇怪,但是是真的。所以你可以使用'$ imagedata = file_get_contents($ filename);'來加載圖像。 (注意共享主機環境,但內存可能有限;這將額外消耗2 MB) – mvds 2010-07-18 22:34:18