Почему мой загрузчик изображений работает во всех браузерах, кроме Internet Explorer? - PullRequest
0 голосов
/ 23 февраля 2012

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

За последние несколько месяцев я боролся за то, чтобы создать форму загрузки изображений, которая работает постоянно во всех браузерах.У меня есть более широкие вопросы о том, как сделать мой скрипт загрузки более надежным, но, в частности, у меня есть одна серьезная проблема.

Почему этот скрипт не работает с Internet Explorer?Загрузка через Chrome, Firefox и Safari - все работает отлично.Однако, когда я загружаю изображение с помощью IE, оно отклоняется за неправильный тип файла.

Вот что я пытался / исследовал в ходе решения этой проблемы.

1) Убедитесь, что enctype="multipart/form-data" был включен в мою HTML-форму

2) Попытка использовать exif_imagetype($file) для получения типа файла, а не getimagesize() (Примечание: я также включил exif_imagetype() в моем файле php.ini).Я читал, что это был более надежный метод определения типов файлов.Эта функция работает в трех других браузерах, однако при использовании IE она все еще не может определить тип файла.

3) Я использовал var_dump($_FILES), чтобы увидеть, что загружается.Это показывает имя, размер, тип и т. Д. Во всех браузерах, кроме IE.На IE кажется, что нет имени для загруженного файла.при отображении названия: "string '' (length=0)"

HTML-форма, сценарий загрузки изображения и сценарий изменения размера изображения расположены ниже.

ФОРМА:

<form method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="625000"> 
<input type="file" class="span2" name="image" id="image" size="20">                        
<input name="picture" type="submit" value="update" class="btn btn-primary" style="margin-bottom: -10px"> 
</form>

ЗАГРУЗИТЬ СКРИПТ:

if (isset($_POST['picture'])){
 //THIS SECTION IS FOR UPLOADING THE PROFILE PICTURE. 
 //It will create a standard profile image size 320 by 320.
 //It also then creates a 'thumbnail' picture size 100 x 100



//delete the original profile image (if there was one)
$CurrentImage = getImage("profile",$id,FALSE);
$CurrentImageThumb = getImage("profile",$id,TRUE);
//if the current image is something other than the generic image, delete the current images
            if($CurrentImage!="images/profile/generic.jpg")unlink($CurrentImage);           if($CurrentImageThumb!="images/profile/genericthumb.jpg")unlink($CurrentImageThumb); 


//get the type of the upload            
$pic_type = ".".pathinfo($_FILES['image']['name'], PATHINFO_EXTENSION);

//save the initial file
$saveto = "images/profile/$id"."$pic_type";
move_uploaded_file($_FILES['image']['tmp_name'], $saveto);

//resize it and display the appropriate message if it works/doesn't work
//CREATE FULL SIZE
if (true === ($pic_error = image_resize($saveto,$saveto, 320, 320, 0))){

//CREATE THUMBNAIL
$saveto2 = "images/profile/$id"."thumb"."$pic_type";                
if (true === ($pic_error = image_resize($saveto,$saveto2, 100, 100, 0))){

showAlert(2,"Your image has been uploaded!"," If the image did not change, <a href=\"./editprofile\">click here</a> to reload the page.");

}}else{
showAlert(3,"File Issue: ",$pic_error);
unlink($saveto);//delete the upload 
unlink($saveto2);//delete the upload    
}
}

СКРИП С ИЗМЕНЕНИЕМ ИЗМЕНЕНИЯ ИЗОБРАЖЕНИЯ:

 function image_resize($src, $dst, $width, $height, $crop=0){

    //if getimagesize doesn't output an array with the first two values being width and height, we reject the file

    if(!list($w, $h) = getimagesize($src)) return "Unsupported file type. We only accept image files the extension .jpg, .jpeg, .png, .gif, or .bmp";

      //get the image type based on the file extension
      $type = strtolower(substr(strrchr($src,"."),1));

      //based on file type, create a new image from the url
      if($type == 'jpeg') $type = 'jpg';
      switch($type){
        case 'bmp': $img = imagecreatefromwbmp($src); break;
        case 'gif': $img = imagecreatefromgif($src); break;
        case 'jpg': $img = imagecreatefromjpeg($src); break;
        case 'png': $img = imagecreatefrompng($src); break;
        default : return "Unsupported file type. We only accept image files with the extension .jpg, .jpeg, .png, .gif, or .bmp";
      }


  // resize (get the dimensions for resize if $crop or not)
  if($crop){

    //if initial image is smaller than crop size display error
    if($w < $width or $h < $height) return "Picture is too small. Your image must be LARGER than ".$width."pixels by ".$height." pixels.";
    $ratio = max($width/$w, $height/$h);
    $h = $height / $ratio;
    $x = ($w - $width / $ratio) / 2;
    $w = $width / $ratio;
  }
  else{
    if($w < $width and $h < $height) return "Picture is too small. Your image must be LARGER than ".$width."pixels by ".$height." pixels.";
    $ratio = min($width/$w, $height/$h);
    $width = $w * $ratio;
    $height = $h * $ratio;
    $x = 0;
  }

  //create a new true color image
  $new = imagecreatetruecolor($width, $height);

  // preserve transparency
  if($type == "gif" or $type == "png"){
    imagecolortransparent($new, imagecolorallocatealpha($new, 0, 0, 0, 127));
    imagealphablending($new, false);
    imagesavealpha($new, true);
  }

  //COPY AND RESIZE THE IMAGE
  /**imagecopyresampled ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , 
  int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h )

  imagecopyresampled() will take an rectangular area from src_image of width src_w and height src_h at 
  position (src_x,src_y) and place it in a rectangular area of dst_image of width dst_w and height dst_h at position (dst_x,dst_y).
  */
  imagecopyresampled($new, $img, 0, 0, $x, 0, $width, $height, $w, $h);

  //then output the image to the file
  switch($type){
    case 'bmp': imagewbmp($new, $dst); break;
    case 'gif': imagegif($new, $dst); break;
    case 'jpg': imagejpeg($new, $dst); break;
    case 'png': imagepng($new, $dst); break;
  }
  return true;
}

1 Ответ

0 голосов
/ 25 февраля 2012

Проблема не заключалась в PHP вообще, и сама форма HTML была настроена просто отлично.

Наш дизайнер создал уникальную кнопку «Обзор» для загрузки файлов. Эта кнопка конфликтовала с IE и препятствовала отправке загруженных файлов. Не уверен, поможет ли этот вопрос и ответ кому-либо еще или нет.

Мораль истории, когда вы зашли в тупик с отладкой, поговорите с дизайнером.

...