我正在编写一个允许我上传文件的代码。代码是将文件转换为全部小写。检查以确保文件名尚未插入数据库中,如果用户上传.png或.jpg文件,请将图像大小调整为缩略图并保留两者的副本缩略图和常规尺寸图像位于名为:uploads的文件夹中。我仍然有点混乱,因为有些东西是正确的,我一遍又一遍。我不知道是否可能我已经工作了好几天或什么不是,但我看不到任何东西。不仅如此,我仍然是一名新手。
这是我的代码:
$aryImages=array("image/jpeg","image/png");
$aryDocs=array("application/msword","application/pdf","video/x-msvideo");
$filename=filenameSafe($_FILES['upload']['name']);
$fileType=$_FILES["upload"]["type"];
if (in_array($_FILES["upload"]["type"],$aryImages)){
createThumb($fileType,$_FILES['upload']['tmp_name'],$filename,100,100);
}
elseif (in_array($_FILES["upload"]["type"],$aryDocs)){
move_uploaded_file($_FILES['upload']['tmp_name'],
"../imagefolder/".$filename);
$aryColumns=array("sessionID"=>$curSess,"fileName"=>$filename,"fileType"=>$fileType,"thumbFileName"=>$thumbFilename,"dateCreated"=>date('Y-m-d H:i:s'));
dbInsert($filename,$aryColumns,$_FILES["upload"]["type"]);
}
else{
echo "File Uploaded";
}
}
function createThumb($type,$tmpname,$filename,$new_w,$new_h){
$thumbFilename="tmb-".$filename;
if (is_numeric(strpos($type,"jpeg"))){
$src_img=imagecreatefromjpeg($tmpname);
}
if (is_numeric(strpos($type,"png"))){
$src_img=imagecreatefrompng($tmpname);
}
$old_x=imageSX($src_img);
$old_y=imageSY($src_img);
if ($old_x > $old_y) {
$thumb_w=$new_w;
$thumb_h=$old_y*($new_h/$old_x);
}
if ($old_x < $old_y) {
$thumb_w=$old_x*($new_w/$old_y);
$thumb_h=$new_h;
}
if ($old_x == $old_y) {
$thumb_w=$new_w;
$thumb_h=$new_h;
}
$dst_img=imagecreatetruecolor($thumb_w,$thumb_h);
imagecopyresampled($dst_img,$src_img,0,0,0,0,$thumb_w,$thumb_h,$old_x,$old_y);
if (is_numeric(strpos($type,"jpeg"))){
imagejpeg($dst_img,"../upload/".$thumbFilename);
imagejpeg($src_img,"../upload/".$filename);
}
if (is_numeric(strpos($type,"png"))){
imagepng($dst_img,"../upload/".$thumbFilename);
imagepng($src_img,"../upload/".$filename);
}
imagedestroy($dst_img);
imagedestroy($src_img);
dbInsert($filename,$thumbFilename,$type);
}
function filenameSafe($filename) {
$temp = $filename;
// Lower case
$temp = strtolower($temp);
// Replace spaces with a ’_’
$temp = str_replace(" ", "_", $temp);
// Loop through string
$result = "";
for ($i=0; $i<strlen($temp); $i++) {
if (preg_match('([0-9]|[a-z]|_|.)', $temp[$i])) {
$result = $result.$temp[$i];
}
}
dbConnect();
$SQL="SELECT fileID FROM upload WHERE fileName='".$result."'";
//echo $SQL;
$rs=mysql_query($SQL);
echo mysql_num_rows($rs);
if(mysql_num_rows($rs)!=0){
$extension=strrchr($result,'.');
$result=str_replace($extension,time(),$result);
$result=$result.$extension;
}
return $result;
}
function dbInsert($filename,$thumbFilename,$type){
dbConnect();
$SQL="INSERT Into tblFile (fileName,thumbFileName,fileType) values('".$filename."','".$thumbFilename."','".$type."')";
echo $query;
exit;
mysql_query($SQL);
}
我认为它在某个地方循环,我只是无法抓住它。当我在浏览按钮后单击上传按钮时,页面上没有任何内容,没有图片或任何内容。我没有得到任何错误或没有。有人可以帮帮我吗。如果我尝试将一些代码放出来,它将开始给我错误和致命错误。谢谢你的期待。
答案 0 :(得分:0)
你有几个问题,所以我现在只关注一个领域,希望能帮助你在将来编写更好的代码。
您的filenameSafe()
功能非常低效。在循环内的字符串的每个字符上使用正则表达式就像用大锤绑在手柄上的炸药一样打破鸡蛋。此外,如果您的目标是在将数据保存到数据库之前清理数据,则应在查询数据库之前对数据使用mysql_real_escape_string()
。
此外,通过简单地在文件名中找到第一个出现的句点以确定扩展开始的位置是可疑的...如果多个句点以某种方式将其作为文件名会怎么样?相反,请尝试使用pathinfo()来获取扩展名。
最后,我假设通过附加当前时间戳,您试图避免文件系统中的文件名冲突。这不是一个合适的解决方案,因为很有可能在同一秒内保存两个文件。虽然有关于像哈希这样的主题的全书,但是为了时间的推移,我只是说你可以通过在文件名上快速md5()
或uniqid()
来获得更好的服务。
那么,一个如何更好地处理代码特定部分的例子:
function filenameSafe($filename)
{
// Lower case
$filename = strtolower($filename);
// get extension
$ext = pathinfo($filename, PATHINFO_EXTENSION);
// Replace spaces with a ’_’
$filename = str_replace(" ", "_", $filename);
// Replace non-alphanumerics (except underscores)
$filename = preg_replace('/\W/', '', $filename);
// append the timestamp
$filename = $filename . time();
// create an md5 hash
$result = md5($filename);
// ensure the string is safe for the db query
$result = mysql_real_escape_string($result);
dbConnect();
$SQL="SELECT fileID FROM upload WHERE fileName='".$result.".$ext'";
$rs = mysql_query($SQL);
if (mysql_num_rows($rs) > 0) {
$result = str_replace(".$ext", time(), $result);
$result = "$result.$ext";
}
return $result;
}