Мне нравится загружать некоторые изображения в каталог с помощью массивов. поэтому у меня есть этот код:
$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)) {
это сообщение будет отображаться для каждого изображения, кроме первого. поэтому я понятия не имею, что я делаю неправильно. я был бы очень признателен, если есть кто-то, кто мог бы мне помочь. я действительно был бы признателен. большое спасибо.
Ваш код очень similar
на мой ответ, ограничивая условие проверки при загрузке swf-файлов
Вот как вы должны это реализовать ..
ПОЛНЫЙ Сценарий
<?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>
Во-первых, я бы назвал загруженные поля отдельно. Например, назовите первое поле <input name="image_1" type="file" />
а второе <input name="image_2" type="file" />
. Затем вы можете $_FILES
массив $_FILES
:
foreach($_FILES as $fileId => $file){ //make sure it's 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
.
Помогает ли это?
Почему вы $_FILES
доступ к $_FILES
массиву $_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', ... ] }
Я не уверен, может ли это решить его для вас, но вы можете попытаться преобразовать их в «обычные» значения $_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]);
А затем запустите цикл, как обычно.
См. Предыдущий ответ