2016-03-11 7 views
-2

Попытка разрешить загрузку файла вместе с формой, которая в противном случае работает. Я вырезал соответствующие правила формы/ввода/обработки. Надеюсь, кто-то, кто больше, чем лодыжку в PHP (как я), может указать мне в правильном направлении?PHP Form - загрузка файла не работает

<form name="form-quote" id="form-quote" enctype="multipart/form-data" action="<?php echo $_SERVER['../WPTheme/REQUEST_URI' . '#form-quote'] ?>" method="POST"> 

    <div class="form_labels"> 
    <p><label for="fileupload">Upload File (optional):</label></p> 
    </div> 
    <div class="form_inputs"> 
    <input type="hidden" name="MAX_FILE_SIZE" value="5242880" /> 
    <p><input type="file" name="fileupload" id="fileupload" accept=".pdf, .txt, .rtf, .doc, .docx, .xls, .xlsx" style="margin-bottom:2px;"/> 
    <span style="color:#777;">(pdf, txt, rtf, doc, docx, xls, xlsx, &lt;5MB)</span></p> 
    </div> 

    <input type="hidden" name="formtype" id="formtype-quote" value="quote"> 

    <div class="form_labels submit"> 
    <p>&nbsp;</p> 
    </div> 

    <div class="form_inputs"> 
    <a href="javascript:void(0);"><input type="submit" value="Submit" name="action" class="btn-red" ></a> 
    </div> 

</form> 

<?php 
//$formerrors is set to false unless one of the validation rules for the OTHER fields fails - no validation on the file upload, although I would like to trim & sanitize it if possible. 

if (!($formerrors) && isset($_POST['fileupload'])): 
    $tmp_name = $_FILES["fileupload"]["temp_name"]; 
    $uploadfilename = $_FILES["fileupload"]["name"]; 
    $savedate = date("mdy-Hms"); 
    $newfilename = "/wp-content/uploads_forms/" . $savedate . "_" . $uploadfilename; 
    $uploadurl = 'http://' . $_SERVER['SERVER_NAME'] . $newfilename; 
    if (move_uploaded_file($tmp_name, $newfilename)): 
     $msg = "File uploaded."; 
    else: 
     $msg = "Sorry, your file could not be uploaded." . $_FILES['file']['error']; 
     $formerrors = true; 
    endif; //move uploaded file 
endif; 

?> 

Благодаря ответ Александра ниже, я был в состоянии изменить свой валидатор для работы и для достижения моих первоначальных целей (проверки на нуль, и дать файлы уникальных имен перед загрузкой). Вот мой «окончательный проект», который сейчас работает.

//Check form errors, check file name not null, rename file with unique identifier to avoid overwriting existing files with same name 

if (!($formerrors)) { 
    $tmp_file = $_FILES["fileupload"]["tmp_name"]; 
    if ($tmp_file != "") { 
    $savedate = date("mdy-Hms"); 
    $target_dir = "wp-content/uploads/"; 
    $target_file = $target_dir . $savedate . '_' . $_FILES["fileupload"]["name"]; 
    if (move_uploaded_file($tmp_file, $target_file)) { 
     $msg = "File uploaded."; 
    } else { 
     $msg = "Sorry, your file could not be uploaded."; 
     $formerrors = true; 
    }//move successful 
    }//end null check 
}//end form errors check 
+1

PHP не JS. Похоже, что вам нужен подход AJAX. ' '. Также PHP не доступен после загрузки страницы. – chris85

+0

Извините - сценарии скриптов изменены на PHP. Просто ошибочно при копировании кода. – supernaut

ответ

0

код используется выше Javascript. Если вы зависите от этого, пожалуйста, измените теги сообщения. Если не здесь есть возможность для PHP-Uploadscript:

$target_dir = "uploads/"; 
$target_file = $target_dir . basename($_FILES["fileupload"]["name"]); 

if (move_uploaded_file($_FILES["fileupload"]["tmp_name"], $target_file)) { 
    echo "The file ". basename($_FILES["fileupload"]["name"]). " has been uploaded."; 
} else { 
    echo "Sorry, there was an error uploading your file."; 
} 

ИСТОЧНИК: http://www.w3schools.com/php/php_file_upload.asp

EDIT: Сценарий выше был быть помещен в файл, получающего POST из формы.

+0

Это было очень полезно - спасибо. Как новичок, просто увидеть что-то написанное по-другому помогает мне понять это лучше. Ваш код сам по себе выдает ошибку, если поле загрузки файла равно null (в моей форме загрузка необязательна), а также будет перезаписывать файлы на сервере, если они имеют одинаковое имя (например, «resume.doc «). Таким образом, с новым пониманием из вашего кода, я объединил гибрид, который достигает этих двух вещей для меня. Я добавлю свой последний код к исходному вопросу. Это был отличный опыт - спасибо! – supernaut

0

Код, который вы отправили, является большим беспорядком!
Давайте попробуем уточнить некоторые основные моменты ...

механизм файловом загрузки

Для файлов загрузки на работу вы должны иметь <form> с action атрибут в решении сценарий, где вы будете проверять и использовать загруженный файл.
Этот сценарий может быть таким же, как тот, где генерируется <form>, предполагая, что вы позаботитесь о подводных камнях, которые приходят с этой ситуацией.

При первом общем взгляде ваш текущий код, по-видимому, соответствует последнему случаю.
Но ваша форма action выглядит странно:

action="<?php echo $_SERVER['../WPTheme/REQUEST_URI' . '#form-quote'] ?>" 

В качестве первого намерения, если вы хотите, чтобы обратиться к той же странице, где вы уже находитесь, вы можете просто опустить action атрибут.
Здесь, кажется, явно попробовать то же самое, добавив точность #form-quote, но:

  • Это #form-quote не имеет никакого эффекта здесь, поскольку такое хэш делается таргетинг <a>, в то время как в настоящее время влияет на ваш <form> ,
  • Другая часть URL-адреса, которую вы создаете, представляет собой нечувствительное смешивание REQUEST_URI (которое является именем одного из членов $_SERVER) с жестким выражением пути в вашем контексте.
  • В любом случае все вышесказанное не имеет значения, потому что этот конец с $_SERVER[...something which is not a known $_SERVER member...], поэтому он фактически возвращает NULL, и, как это ни парадоксально, он имеет такой же эффект, как если бы вы не указали action вообще!

PHP в SO фрагмент

Так НУ поставить свой код в сниппет, но SO сниппеты работать только с HTML, CSS и Javascript, поэтому вы не можете ожидать, что она позволяет показать, как ваш код работает или нет.

Обратите внимание, что на этом этапе, несмотря на ошибки, упомянутые выше, мы не указали что-то, что приведет к сбою вашего кода.
И в вашем вопросе вы не упомянули, как это терпит неудачу!

загруженное обработка файлов

Так, глядя на ваш PHP код, то я первый отметить это заявление:

$tmp_name = $_FILES["fileupload"]["temp_name"]; 

где вы ищете temp_name, в то время как истинный вовлечен ключ tmp_name , Одного этого достаточно, чтобы ваш код вышел из строя.

Кроме того, глядя на этих двух утверждений:

$uploadurl = 'http://' . $_SERVER['SERVER_NAME'] . $newfilename; 
if (move_uploaded_file($tmp_name, $newfilename)) 

В 1-ый вы используете $newfilename в качестве дополнения к URL, который вы строите, так что, очевидно $newfilename не может предназначаться для абсолютный физический путь.
Это означает, что во 2-м вы попробуете move_uploaded_file() в неправильном месте!

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

if (!($formerrors) && isset($_POST['fileupload'])) && !$_FILES["fileupload"]["error"]) 

И если вы эффективно получить некоторые ошибки и имеют проблемы, чтобы понять, почему, вы также должны смотреть на this interesting PHP manual page.

+0

Извините за то, что вы не публикуете всю форму - она ​​длинная и сложная. (Из учебника Lynda.com, поэтому методы не мои ... У меня пока нет методов!) Я подумал, что лучше всего сосредоточиться на соответствующих частях, и, увидев код Александра, я помог мне направить корабль. * YOU ARE RIGHT *, что у меня есть пара опечаток в моем исходном коде, который, возможно, был основной причиной, по которой он не работал. Я использовал «temp_name» вместо «tmp_name», и у меня также была ведущая косая черта в моем целевом каталоге, которого не должно было быть. Спасибо за ваш отзыв и ввод. Мне нужно многому научиться, и я ценю всю помощь на этом форуме. – supernaut