Ошибка при загрузке нескольких изображений одновременно

1

Я пытаюсь загрузить несколько фотографий одновременно, но, похоже, с моим скриптом возникает ошибка. Если, например, я выбираю 10 разных фотографий, одно изображение загружается 10 раз (игнорируя остальные 9 изображений). Это сценарий:

for ($i = 0; $i < count($_FILES["_photo"]["name"]); $i++) {  
    if (!empty($_FILES['_photo']['name'][$i])) {

    if (($_FILES['_photo']['type'][$i] == 'image/jpeg') OR ($_FILES['_photo']['type'][$i] == 'image/png') OR ($_FILES['_photo']['type'][$i] =='image/gif')) {
        $upload_folder = "./profile_pix/";
        $pic_name = time() . ".jpg";
        $pic_path = $upload_folder . $pic_name;

        require_once "include/resize.php";
        if (move_uploaded_file($_FILES['_photo']['tmp_name'][$i], $pic_path)) {
            $image = new Resize($pic_path);
            $image->resizeImage(180, 180, 'crop');
            $image->saveImage($pic_path);

        }
            $sql2 = "INSERT INTO photos
            (photo, member_id, photo_id)
             VALUES
            ('$pic_name', :session_id, :offer_count)";
            $db -> query($sql2, array('session_id' => $_SESSION['id'], 'offer_count' => $offer_count));
    }else {
            header ("Location: submitoffer.php?err=03");
        }


    }

HTML:

<input type="file" id="_photo"  name="_photo[]" multiple="multiple">
  • 0
    Можете ли вы добавить HTML?
  • 0
    Можете ли вы опубликовать, какую ошибку вы получаете ????
Показать ещё 6 комментариев
Теги:

3 ответа

1
Лучший ответ

Загрузка файлов работает нормально.

Линия

$pic_name = time() . ".jpg";

всегда оценивает одно и то же значение.

Как логически все файлы загружаются в одно и time() же time().

Вместо этого используйте:

$pic_name = $i . '_'. time() . ".jpg";

Добавить уникальность.

  • 0
    Я мог бы поспорить с использованием uniqid() качестве замены для time (), но это все еще не говорит, почему uniqid() та же фотография загружается 10 раз;)
  • 0
    Вероятно, он загружает все файлы с одинаковыми именами, поскольку время возвращает метку времени Unix, которая указана в секундах, а php может легко загрузить 10 или более файлов за секунду.
Показать ещё 1 комментарий
0

100% работающий и проверенный код:

upload.php:

<?php
if($_SERVER['REQUEST_METHOD'] === 'POST') {
  if(isset($_FILES['files'])){
    foreach($_FILES['files']['tmp_name'] as $key => $tmp_name ){
      $file_name  = $_FILES['files']['name'][$key];
      $file_size  = $_FILES['files']['size'][$key];
      $file_tmp   = $_FILES['files']['tmp_name'][$key];
      $file_type  = $_FILES['files']['type'][$key];  
      if($file_type == "image/jpg" || $file_type == "image/png" || $file_type == "image/jpeg" || $file_type == "image/gif" ) {      
        move_uploaded_file($file_tmp,"uploads/".$file_name);        
      }   
    }
    header('location:uploads.html'); 
  }
}
else { header('location:404.html'); }
?>

upload.html

<form id="upload_images" action="upload.php" method="POST"  enctype="multipart/form-data">
      <input type="file" name="files[]" id="file" multiple="true" />                
      <input type="submit" id="btn_upload"  value="U P L O A D" />
</form>
0

попробуйте это, и вы увидите, что происходит:

<?php
    echo "<pre>";
    print_r($_FILES);
    echo "</pre>";
?>

И в своем HTML, убедитесь, что вы используете разные имена, например:

<input name="userfile[]" type="file" />
<input name="userfile[]" type="file" />
<input name="userfile[]" type="file" />

Затем заберите их по каждому имени. Просто ознакомьтесь с содержанием $ _FILES, чтобы понять структуру.

Я также советую вам серьезно проверить некоторые ошибки.

  • 0
    Он должен иметь массив как имя в HTML
  • 0
    Я изменил его на массив, но это не обязательно. Вы также можете назвать их по-разному. Я предпочитаю ваше предложение выше дать им разные имена, так что вы идете!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню