PHP Upload Script - проблема с размером файла и типом файла - PullRequest
0 голосов
/ 19 января 2012

У меня есть следующий код, который используется в качестве сценария загрузки

$allowed_filetypes = array('.jpg', '.jpeg', '.gif', '.bmp', '.png'); 
$max_filesize = 262144; 
$upload_normal_path = '../uploads/normal/'; 
$upload_thumb_path = '../uploads/thumbnail/';

if(isset($_POST['Submit']))
{
$filename = $_FILES['image']['name']; 
$filesize = $_FILES['image']['size']; 
$fileext = substr($filename, strpos($filename,'.'), strlen($filename)-1);

if(!in_array($fileext, $allowed_filetypes)){
$upload_status = "The file you attempted to upload is not allowed.";
}

if($filesize > $max_filesize){
$upload_status = "The file you attempted to upload is too large.";
}

$image_name = time().$fileext;
$newname = $image_name;

$moved = move_uploaded_file($_FILES['image']['tmp_name'],$upload_normal_path . $newname);

if(!$moved){
$upload_status = 'There was an error during the file upload.  Please try again.';
} else {
$upload_status = 'Your file upload was successful, view the file <a href="' . $upload_normal_path . $newname . '" title="Your File">here</a>';
}
}

Иногда кажется, что сам скрипт работает, но, похоже, он пропускает некоторые ситуационные IF и ELSE. Например, если размер файла больше, чем $ filesize, я не получаю правильный $ upload_status, который должен сказать «Файл, который вы пытались загрузить, слишком большой», вместо этого он, кажется, пропускает весь путь до «Был ошибка при загрузке файла. Пожалуйста, попробуйте еще раз ". Кроме того, иногда я могу загрузить некоторые файлы MP3 или HTML через, что означает, что он пропускает все (! In_array ($ fileext, $ allow_filetypes)).

Любая идея, что может быть причиной этих проблем и как их решить. С наилучшими пожеланиями

[РЕШЕНО] Спасибо всем за ваше время и ответы, они очень ценятся. Посмотрев на ваши ответы, я немного очистил код, пока не заставил его делать именно то, что мне было нужно.

Итак, вот копия моего текущего кода, в надежде, что он поможет любому коллеге-разработчику, который может столкнуться с такой проблемой.

С наилучшими пожеланиями

Текущий рабочий код:

function make_thumb($img_name,$filename,$new_w,$new_h)
{

$ext=getExtension($img_name);

if(!strcmp("jpg",$ext) || !strcmp("jpeg",$ext))
$src_img=imagecreatefromjpeg($img_name);

if(!strcmp("png",$ext))
$src_img=imagecreatefrompng($img_name);


$old_x=imageSX($src_img);
$old_y=imageSY($src_img);

$ratio1=$old_x/$new_w;
$ratio2=$old_y/$new_h;
if($ratio1>$ratio2) {
$thumb_w=$new_w;
$thumb_h=$old_y/$ratio1;
}
else {
$thumb_h=$new_h;
$thumb_w=$old_x/$ratio2;
}

$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(!strcmp("png",$ext))
imagepng($dst_img,$filename);
else
imagejpeg($dst_img,$filename);

imagedestroy($dst_img);
imagedestroy($src_img);
}

function getExtension($str) {
$i = strrpos($str,".");
if (!$i) { return ""; }
$l = strlen($str) - $i;
$ext = substr($str,$i+1,$l);
return $ext;
}

$upload_status = "";
$max_filesize = 2097152;
$error = 0;
$allowed_filetypes = array('jpg', 'jpeg', 'png', 'JPG', 'JPEG', 'PNG'); 

if(isset($_POST['Submit']))
{

$image = $_FILES['image']['name'];

if ($image)
{

$filename = stripslashes($_FILES['image']['name']);
$sizekb = filesize($_FILES['image']['tmp_name']);

$extension = getExtension($filename);
$extension = strtolower($extension);

    if(!in_array($extension, $allowed_filetypes)){
    $upload_status = "<div id='file-upload'><div class='upload-bar-error'><span class='upload-error'>The file extension is not supported.</span></div></div>";
    $error = 1;
    }

    if(isset($_SERVER['CONTENT_LENGTH']) && $_SERVER['CONTENT_LENGTH']> $max_filesize){
    $upload_status = "<div id='file-upload'><div class='upload-bar-error'><span class='upload-error'>The file size has extended the size limit.</span></div></div>";
    $error = 1;
    }

    if($error == 0){
    $image_name=time().'.'.$extension;

    $newname="../uploads/normal/".$image_name;
    $newname_db = "uploads/normal/".$image_name;
    copy($_FILES['image']['tmp_name'], $newname);

    $thumb_name='../uploads/thumbnail/thumb_'.$image_name;
    $thumb_name_db = 'uploads/thumbnail/thumb_'.$image_name;
    $thumb = make_thumb($newname,$thumb_name,$thumb_width,$thumb_height);

    $upload_status = "<div id='file-upload'><div class='upload-bar-success'><span class='upload-success'>The file has been uploaded successfully.</span></div></div>";
    }

}
}

Ответы [ 3 ]

1 голос
/ 19 января 2012

Потому что вы всегда делаете move_uploaded_file.

1 голос
/ 19 января 2012

Это потому, что последнее предложение if перезапишет сообщение $upload_status.

Вот правильный код:

$allowed_filetypes = array('.jpg', '.jpeg', '.gif', '.bmp', '.png'); 
$max_filesize = 262144; 
$upload_normal_path = '../uploads/normal/'; 
$upload_thumb_path = '../uploads/thumbnail/';

if (isset($_POST['Submit'], $_FILES['image'])) {
  $filename = $_FILES['image']['name']; 
  $filesize = $_FILES['image']['size']; 
  $fileext = substr($filename, strpos($filename, '.'), strlen($filename) - 1);

  $errors = array();

  if (!in_array($fileext, $allowed_filetypes)) {
    $errors[] = 'The file you attempted to upload is not allowed.';
  }

  if ($filesize > $max_filesize) {
    $errors[] = 'The file you attempted to upload is too large.';
  } elseif ($filesize == 0) {
    $errors[] = 'You cannot upload a empty file.';
  }

  if (sizeof($errors)) {
    echo '<p>There was some error: </p><ul>';
    for ($i = 0, $errorsLength = sizeof($errors); $i < $errorsLength; ++$i) {
      echo '<li>' . $errors[$i] . '</li>';
    }
    echo '</ul>';
  } else {
    $newname = time() . $fileext;
    $moved = move_uploaded_file($_FILES['image']['tmp_name'], $upload_normal_path . $newname);

    if (!$moved) {
      echo 'There was an error during the file upload. Please try again.';
    } else {
      echo '<p>Your file upload was successful, view the file <a href="' . $upload_normal_path . $newname . '" title="Your File">here</a></p>';
    }
  }
}
0 голосов
/ 19 января 2012

На самом деле это происходит потому, что вы используете команду serialize if.Вы используете два условия «если», то есть

if(!in_array($fileext, $allowed_filetypes)){$upload_status = "The file you attempted to upload is not allowed.";}

и

if(!$moved){$upload_status = 'There was an error during the file upload.  Please try again.';}

значение переменной изменяется при!вместо того, чтобы использовать функцию die, чтобы напечатать то, что вы хотите

die("The file you attempted to upload is not allowed.");
...