У меня есть следующая форма, в которой пользователь может выбрать файлы для загрузки. Эта часть в порядке, работает multi-select:
<form action="upload.php" method="post" enctype="multipart/form-data"> <input type="file" multiple="multiple" name="fileToUpload[]" id="fileToUpload"> <button type="submit" class="btn btn-primary" value="Upload Image" name="submit">Fájlok feltöltése</button> </form>
И следующий php, который используется для загрузки файлов:
<?php $ID = uniqid(); mkdir("temp/" . $ID); $target_dir = "temp/" ; $target_file = $target_dir . "/" . $ID . "/" . basename($_FILES["fileToUpload"]["name"]); $target = basename($target_file,".docx"); $uploadOk = 1; $imageFileType = pathinfo($target_file,PATHINFO_EXTENSION); // Check if file already exists // Check if $uploadOk is set to 0 by an error if ($uploadOk == 0) { echo "Sorry, your file was not uploaded."; // if everything is ok, try to upload file } else { if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) { echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded."; } else { echo "Sorry, there was an error uploading your file."; } } ?>
Я не могу заставить код работать. Я пробовал много разных способов. Я полагаю, что мне нужен где-нибудь, а где? Что я делаю не так?
update: Если я вставляю upload.php: die('<pre>'.print_r($_FILES["fileToUpload"], true).'</pre>');
при попрошайничестве php я получаю следующее:
Array ( [name] => Array ( [0] => sablonTeszt20150805.docx [1] => sablonTeszt20150805 másolat.docx [2] => sablonTeszt20150805 másolat 2.docx ) [type] => Array ( [0] => application/vnd.openxmlformats-officedocument.wordprocessingml.document [1] => application/vnd.openxmlformats-officedocument.wordprocessingml.document [2] => application/vnd.openxmlformats-officedocument.wordprocessingml.document ) [tmp_name] => Array ( [0] => /Applications/MAMP/tmp/php/phpiu1FTX [1] => /Applications/MAMP/tmp/php/phpHm4xiV [2] => /Applications/MAMP/tmp/php/phpjKZV72 ) [error] => Array ( [0] => 0 [1] => 0 [2] => 0 ) [size] => Array ( [0] => 65647 [1] => 65647 [2] => 65647 ) )
Если вы хотите загрузить несколько файлов .docx, это то, что вы можете сделать. На каждом критическом этапе я добавил комментарии, чтобы вы поняли, что происходит на каждом шагу.
HTML
<form action="index.php" method="post" enctype="multipart/form-data"> <input type="file" multiple="multiple" name="fileToUpload[]" id="fileToUpload"> <button type="submit" class="btn btn-primary" value="Upload Image" name="submit">Fájlok feltöltése</button> </form>
PHP
<?php if(isset($_POST['submit'])){ $ID = uniqid(); // file mode: 777 // read, write and execute for everyone // you should change this file mode based on your requirement mkdir("temp" . DIRECTORY_SEPARATOR . $ID, 0777, true); $target_dir = "temp" . DIRECTORY_SEPARATOR . $ID ; // count the number of files uploaded $num_of_files = count($_FILES["fileToUpload"]["name"]); // loop through each file to upload for($i = 0; $i < $num_of_files; ++$i){ $target_file = $target_dir . DIRECTORY_SEPARATOR . basename($_FILES["fileToUpload"]["name"][$i]); $uploadOk = 1; // get the file extension $ext = strtolower(pathinfo($target_file,PATHINFO_EXTENSION)); // check if it's a .docx file if($ext == "docx"){ // Check if file already exists // Check if $uploadOk is set to 0 by an error if ($uploadOk == 0) { echo "Sorry, your file was not uploaded."; // if everything is ok, try to upload file } else { if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"][$i], $target_file)) { echo "The file ". basename($_FILES["fileToUpload"]["name"][$i]). " has been uploaded."; } else { echo "Sorry, there was an error uploading your file."; } } }else{ echo "only .docx files are allowed"; } } } ?>
Sidenote: Чтобы обеспечить кросс-платформенную совместимость, вы должны использовать константу DIRECTORY_SEPARATOR
PHP для записи строк строк, например "..".DIRECTORY_SEPARATOR."foo"
, потому что способ сделать это в Windows будет "..\foo"
в то время как во всем остальном (Linux, UNIX, Mac OS X) это будет "../foo"
.
Валидация – ключевая особенность. Приведенный ниже код проверяет каждый файл в массиве fileToUpload [] на основе двух критериев. Допустимое расширение и дублирование имен файлов. Если файл проходит проверку, он будет перемещен в каталог пользователей.
Кроме того, при загрузке нескольких файлов одна ошибка проверки файла не завершит обработку. Проверяемые файлы будут обработаны. Это приводит к лучшему опыту пользователя.
Для удобства чтения этапы обработки разбиты на 3 функции.
Форма HTML
<form action="upload.php" method="post" enctype="multipart/form-data"> <input type="file" multiple="multiple" name="fileToUpload[]" id="fileToUpload"> <button type="submit" class="btn btn-primary" value="Upload Image" name="submit">Fájlok feltöltése</button> </form>
Обработка форм PHP
<?php IF (isset($_POST['submit'])) { // form submitted $ID = uniqid(); // future userid $dir = "temp". DIRECTORY_SEPARATOR . $ID; // upload directory IF (empty($_FILES["fileToUpload"])) { echo("<p>No file(s) uploaded</p>"); }ELSE{ $files = Validate_Uploads($dir); // validate uploaded file(s) $response = Process_Files($dir, $files); // process uploaded files echo(Upload_Response($response)); } } ?>
Функции PHP
<?php Function Validate_Uploads($dir) { // returns an array value for each file in $_FILES[] /* validates each file uploaded # is it a docx file # does it already exist # generates error message on failed validation for each file */ $result = array(); $fileexts = array('docx'); // allowed file extensions $filecnt = count($_FILES["fileToUpload"]["name"]); IF ($filecnt == 1) { // one file uploaded $ext = strtolower(substr(strrchr($_FILES['fileToUpload']['name'], '.'), 1)); // file ext. // validate file type IF (in_array($ext, $fileexts)) { $error = NULL; // Check if file already exists IF (file_exists($dir.DIRECTORY_SEPARATOR.$_FILES['fileToUpload']['name'])) { $error = "The file (".$_FILES['fileToUpload']['name'].") already exists.<br />"; } }ELSE{ $error = "The file type of (".$_FILES['fileToUpload']['name'].") is not supported. (Only ".implode(", ",$fileexts).")<br />"; } $result[] = array( 'filename' => $_FILES['fileToUpload']['name'], 'tempfile' => $_FILES['fileToUpload']['tmp_name'], 'ext' => $ext, 'error' => $error ); }ELSE{ // multiple files uploaded for ($i = 0; $i < $filecnt; ++$i) { $ext = strtolower(substr(strrchr($_FILES['fileToUpload']['name'][$i], '.'), 1)); // file ext. // validate file type IF (in_array($ext, $fileexts)) { $error = NULL; // Check if file already exists IF (file_exists($dir.DIRECTORY_SEPARATOR.$_FILES['fileToUpload']['name'][$i])) { $error = "The file (".$_FILES['fileToUpload']['name'][$i].") already exists.<br />"; } }ELSE{ $error = "The file type of (".$_FILES['fileToUpload']['name'][$i].") is not supported. (Only ".implode(", ",$fileexts).")<br />"; } $result[] = array( 'filename' => $_FILES['fileToUpload']['name'][$i], 'tempfile' => $_FILES['fileToUpload']['tmp_name'][$i], 'ext' => $ext, 'error' => $error ); } } return $result; } Function Process_Files($dir, $files) { // returns a response (success/fail) message foreach file uploaded. $result = array(); IF ( (!file_exists($dir)) && (!is_dir($dir)) ) { mkdir($dir); } Foreach($files as $key => $file) { IF (is_null($file['error'])) { IF (move_uploaded_file($file['tempfile'], $dir.DIRECTORY_SEPARATOR.$file['filename'])) { $result[] = "The file ". $file['filename']. " has been uploaded.<br />"; }ELSE{ $result[] = "Sorry, ".$file['filename']." could not be uploaded.<br />"; } }ELSE{ $result[] = $file['error']; } } return $result; } Function Upload_Response($response) { // formats response msgs in a paragraph $result = ""; foreach($response as $msg) { $result .= $msg; } return "<p>" . $result . "</p>"; } ?>