неправильное количество изображений при загрузке нескольких файлов

0

Мне нравится загружать некоторые изображения в каталог с помощью массивов. поэтому у меня есть этот код:

$allowedExtensions = array('jpg', 'jpeg', 'png', 'bmp', 'tiff', 'gif');
            $maxSize = 2097152;
            $Dir = "a/b/c/d";
            $storageDir = "a/b/c/d/tmp_images";

            //Arrays
            $errors2 = $output = array();


            if(!empty($_FILES['image'])){  

            // Validation loop (I prefer for loops for this specific task)
            for ($i = 0; isset($_FILES['image']['name'][$i]); $i++) {

                $fileName = $_FILES['image']['name'][$i];
                $fileSize = $_FILES['image']['size'][$i];
                /*$fileErr = $_FILES['image']['error'][$i];*/
                $fileExt = strtolower(pathinfo($fileName, PATHINFO_EXTENSION));

                // Dateiendung überprüfen
                if (!in_array($fileExt, $allowedExtensions)) {
                    $errors2[$fileName][] = "format $fileExt in $fileName is not accepted";
                }

                // check filesize
                if ($fileSize > $maxSize) {
                    $errors2[$fileName][] = "maxsize of 2MB exceeded";
                }


            }

            /*// Handle validation errors here
            if (count($errors) > 0) {
                echo "Fehler beim Upload des Bildmaterials:"; 
                echo ($errors); ->gibt "Array" aus
            }*/


            if (is_dir($Dir)){
                mkdir($storageDir, 0755);
            }else{
                mkdir($Dir, 0755);
                mkdir($storageDir, 0755);
            }


            // Fileupload
            for ($i = 0; isset($_FILES['image']['name'][$i]); $i++) {

            // Get base info
            $fileBase = basename($_FILES['image']['name'][$i]);
            $fileName = pathinfo($fileBase, PATHINFO_FILENAME);
            $fileExt = pathinfo($fileBase, PATHINFO_EXTENSION);
            $fileTmp = $_FILES['image']['tmp_name'][$i];

            // Construct destination path
            $fileDst = $storageDir.'/'.basename($_FILES['image']['name'][$i]);
            for ($j = 0; file_exists($fileDst); $j++) {
                $fileDst = "$storageDir/$fileName-$j.$fileExt";
            }

            // Move the file 

            if (count($errors2) == 0) { 
                if (move_uploaded_file($fileTmp, $fileDst)) {
                                    ...
                                }
                        }

проблема с этим кодом заключается в следующем: при загрузке двух или более файлов с принятым окончанием он будет вызывать:

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to access abc2.png in /a/b/xxx.php on line xxx

который ссылается на эту строку:

if (move_uploaded_file($fileTmp, $fileDst)) {

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

Теги:
file-upload
image
move

4 ответа

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

Ваш код очень similar для моего ответа на ограничивает условие проверки при загрузке swf файлов

Вот как вы должны это реализовать.

FULL Script

<?php
error_reporting ( E_ALL );
$allowedExtensions = array (
        'jpg',
        'jpeg',
        'png',
        'bmp',
        'tiff',
        'gif' 
);
$maxSize = 2097152;
$dirImage = "photos/tmp_images";
$errors = $output = array ();
if (isset ( $_FILES ['image'] )) {
    foreach ( $_FILES ['image'] ['tmp_name'] as $key => $val ) {

        $fileName = $_FILES ['image'] ['name'] [$key];
        $fileSize = $_FILES ['image'] ['size'] [$key];
        $fileTemp = $_FILES ['image'] ['tmp_name'] [$key];

        $fileExt = pathinfo ( $fileName, PATHINFO_EXTENSION );
        $fileExt = strtolower ( $fileExt );

        if (empty ( $fileName ))
            continue;

            // Dateiendung überprüfen
        if (! in_array ( $fileExt, $allowedExtensions )) {
            $errors [$fileName] [] = "format $fileExt in $fileName is not accepted";
        }

        if ($fileSize > $maxSize) {
            $errors [$fileName] [] = "maxsize of 2MB exceeded";
        }

        if (! mkdir_recursive ( $dirImage, 0777 )) {
            $errors [$fileName] [] = "Error  Creating /Writing  Directory $dirImage ";
        }

        // Construct destination path
        $fileDst = $dirImage . DIRECTORY_SEPARATOR . $fileName;
        $filePrifix = basename ( $fileName, "." . $fileExt );
        $i = 0;
        while ( file_exists ( $fileDst ) ) {
            $i ++;
            $fileDst = $dirImage . DIRECTORY_SEPARATOR . $filePrifix . "_" . $i . "." . $fileExt;

        }
        // Move the file

        if (count ( $errors ) == 0) {
            if (move_uploaded_file ( $fileTemp, $fileDst )) {
                // ...

                $output [$fileName] = "OK";
            }
        }

    }
}

function mkdir_recursive($pathname, $mode) {
    is_dir ( dirname ( $pathname ) ) || mkdir_recursive ( dirname ( $pathname ), $mode );
    return is_dir ( $pathname ) || mkdir ( $pathname, $mode );
}
if (! empty ( $errors )) {
    echo "<pre>";
    foreach ( $errors as $file => $error ) {
        echo $file, PHP_EOL;
        echo "==============", PHP_EOL;
        foreach ( $error as $line ) {
            echo $line, PHP_EOL;
        }
        echo PHP_EOL;
    }
    echo "</pre>";
}

if (! empty ( $output )) {
    echo "<pre>";
    echo "Uploaded Files", PHP_EOL;
    foreach ( $output as $file => $status ) {
        echo $file, "=", $status, PHP_EOL;
    }

    echo "</pre>";
}
?>


<form method="post" enctype="multipart/form-data">
    <label for="file">Filename 1:</label> <input type="file" name="image[]"
        id="file" /> <br /> <label for="file">Filename 2:</label> <input
        type="file" name="image[]" id="file" /> <br /> <label for="file">Filename
        3:</label> <input type="file" name="image[]" id="file" /> <br /> <input
        type="submit" name="submit" value="Submit" />
</form>
  • 0
    все, что вам нужно сделать, это обновить вопрос, а не создать еще один ... @bonny
  • 0
    Он не растет, потому что вы приняли ответ, не указав, что у вас все еще есть проблемы ... когда вы редактируете и добавляете новую информацию, все будут в курсе и увидят, что они могут сделать, пока проблема не будет решена ....
Показать ещё 27 комментариев
2

Во-первых, я бы назвал загруженные поля отдельно. Например. назовите первое поле <input name="image_1" type="file" /> и второе <input name="image_2" type="file" />. Затем вы можете перебирать массив $_FILES:

foreach($_FILES as $fileId => $file){
    //make sure it a file you want (optional)
    if(!preg_match("/^image\_\d+$/",$fileId){
         continue;
    }

    //the rest of your code from the for loop
}

Во-вторых, вам нужно убедиться, что ваша форма enctype multipart/form-data.

Помогает ли это?

  • 0
    Он использует HTML5 <input type="file" name="image" multiple="multiple" /> , поэтому он получает их в этом формате.
  • 0
    привет и спасибо или отвечу. проблема в том, что я не могу легко назвать каждое поле, потому что это поле ввода создается функцией.
1

Я не уверен, может ли это решить его для вас, но вы можете попытаться преобразовать их в "обычные" значения $_FILES.

$arr_files  =   @$_FILES['image'];

$_FILES     =   array();
foreach(array_keys($arr_files['name']) as $h)
$_FILES["image_{$h}"]    =   array(  'name'      =>  $arr_files['name'][$h],
                                    'type'      =>  $arr_files['type'][$h],
                                    'tmp_name'  =>  $arr_files['tmp_name'][$h],
                                    'error'     =>  $arr_files['error'][$h],
                                    'size'      =>  $arr_files['size'][$h]);

И затем запустите цикл, как обычно.

См. предыдущий связанный ответ

1

Почему вы получаете доступ к суперглобальному массиву $_FILES как трехмерный массив?

если вы хотите, чтобы имя файла файла, загруженного из <input type="file" name="image"/>, все, что вам нужно сделать, это $name = $_FILES[ 'image' ][ 'name' ], в конце нет необходимости [ $i ].

Вам нужно закодировать записи в $_FILES следующим образом:

foreach ( $_FILES as $inputName => $fileData )
{
    // $inputName is be 'image` for the first input and so on,
    // $fileData will be an array of the attributes [ 'name', 'tmp_name', ... ]
}
  • 1
    Он использует HTML5 <input type="file" name="image" multiple="multiple" /> , поэтому он получает их в этом формате.
  • 0
    Я использую это из-за явных сообщений об ошибках, которые мне нравится показывать для каждого файла.

Ещё вопросы

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