Мне нужно загрузить файл на сервер с помощью PHP и HTML-формы.
Я использовал пример w3school: загрузка файла PHP 5, которая очень полезна и мне очень помогла.
Конечно, мне нужно адаптировать этот код, чтобы решить мою проблему, так что это ситуация:
1) HTML-форма помещается в fileform.php :
<!-- fileform.php --> <form action="upload.php" method="post" enctype="multipart/form-data"> <h3>Upload a file:</h3> <input type="file" name="fileToUpload" id="fileToUpload"> <input type="submit" value="Upload" name="submit"> </form>
2) это мой upload.php :
<?php /* upload.php */ set_time_limit(0); $targetDir = "/path/to/upload/dir"; $targetFile = $targetDir . basename($_FILES["fileToUpload"]["name"]); $upload = 1; $fileType = pathinfo($targetFile, PATHINFO_EXTENSION); if(isset($_POST["submit"])) { /* Check file size */ if($_FILES["fileToUpload"]["size"] > 50000000000) { echo "Sorry, your file is too large."; $upload = 0; ob_end_flush(); include("fileform.php"); } /* Allow certain file formats */ if($fileType != "data" ) { echo "Sorry, non valid filetype."; $upload = 0; ob_end_flush(); include("fileform.php"); } /* Check if $uploadOk is set to 0 by an error */ if($upload == 0) { echo "Sorry, your file was not uploaded."; ob_end_flush(); include("fileform.php"); } else { if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $targetFile)) { echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded."; } else { echo "Sorry, there was an error uploading your file."; } ob_end_flush(); include("fileform.php"); } }
в<?php /* upload.php */ set_time_limit(0); $targetDir = "/path/to/upload/dir"; $targetFile = $targetDir . basename($_FILES["fileToUpload"]["name"]); $upload = 1; $fileType = pathinfo($targetFile, PATHINFO_EXTENSION); if(isset($_POST["submit"])) { /* Check file size */ if($_FILES["fileToUpload"]["size"] > 50000000000) { echo "Sorry, your file is too large."; $upload = 0; ob_end_flush(); include("fileform.php"); } /* Allow certain file formats */ if($fileType != "data" ) { echo "Sorry, non valid filetype."; $upload = 0; ob_end_flush(); include("fileform.php"); } /* Check if $uploadOk is set to 0 by an error */ if($upload == 0) { echo "Sorry, your file was not uploaded."; ob_end_flush(); include("fileform.php"); } else { if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $targetFile)) { echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded."; } else { echo "Sorry, there was an error uploading your file."; } ob_end_flush(); include("fileform.php"); } }
в<?php /* upload.php */ set_time_limit(0); $targetDir = "/path/to/upload/dir"; $targetFile = $targetDir . basename($_FILES["fileToUpload"]["name"]); $upload = 1; $fileType = pathinfo($targetFile, PATHINFO_EXTENSION); if(isset($_POST["submit"])) { /* Check file size */ if($_FILES["fileToUpload"]["size"] > 50000000000) { echo "Sorry, your file is too large."; $upload = 0; ob_end_flush(); include("fileform.php"); } /* Allow certain file formats */ if($fileType != "data" ) { echo "Sorry, non valid filetype."; $upload = 0; ob_end_flush(); include("fileform.php"); } /* Check if $uploadOk is set to 0 by an error */ if($upload == 0) { echo "Sorry, your file was not uploaded."; ob_end_flush(); include("fileform.php"); } else { if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $targetFile)) { echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded."; } else { echo "Sorry, there was an error uploading your file."; } ob_end_flush(); include("fileform.php"); } }
в<?php /* upload.php */ set_time_limit(0); $targetDir = "/path/to/upload/dir"; $targetFile = $targetDir . basename($_FILES["fileToUpload"]["name"]); $upload = 1; $fileType = pathinfo($targetFile, PATHINFO_EXTENSION); if(isset($_POST["submit"])) { /* Check file size */ if($_FILES["fileToUpload"]["size"] > 50000000000) { echo "Sorry, your file is too large."; $upload = 0; ob_end_flush(); include("fileform.php"); } /* Allow certain file formats */ if($fileType != "data" ) { echo "Sorry, non valid filetype."; $upload = 0; ob_end_flush(); include("fileform.php"); } /* Check if $uploadOk is set to 0 by an error */ if($upload == 0) { echo "Sorry, your file was not uploaded."; ob_end_flush(); include("fileform.php"); } else { if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $targetFile)) { echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded."; } else { echo "Sorry, there was an error uploading your file."; } ob_end_flush(); include("fileform.php"); } }
в<?php /* upload.php */ set_time_limit(0); $targetDir = "/path/to/upload/dir"; $targetFile = $targetDir . basename($_FILES["fileToUpload"]["name"]); $upload = 1; $fileType = pathinfo($targetFile, PATHINFO_EXTENSION); if(isset($_POST["submit"])) { /* Check file size */ if($_FILES["fileToUpload"]["size"] > 50000000000) { echo "Sorry, your file is too large."; $upload = 0; ob_end_flush(); include("fileform.php"); } /* Allow certain file formats */ if($fileType != "data" ) { echo "Sorry, non valid filetype."; $upload = 0; ob_end_flush(); include("fileform.php"); } /* Check if $uploadOk is set to 0 by an error */ if($upload == 0) { echo "Sorry, your file was not uploaded."; ob_end_flush(); include("fileform.php"); } else { if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $targetFile)) { echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded."; } else { echo "Sorry, there was an error uploading your file."; } ob_end_flush(); include("fileform.php"); } }
Я могу загрузить файл правильно, но я не могу правильно загрузить страницу PHP. Появляется только страница с белым backgroung, показывающим:
Файл file.data загружен.
Предупреждение: session_start () [function.session-start]: не удается отправить ограничитель кеша сеанса – уже отправленные заголовки (вывод запущен на /var/www/upload.php:40) в /var/www/login.php в строке 4
с некоторыми значками страницы PHP …
Я уверен, что я делаю что-то неправильно в файле upload.php, но я не знаю, что именно не так, и как это исправить.
Как мне изменить свой код, чтобы правильно загрузить страницу PHP?
Спасибо заранее за вашу помощь.
«Заголовки уже отправлены» означает, что ваш PHP-скрипт уже отправил заголовки HTTP, и поэтому он не может вносить в них изменения.
Убедитесь, что вы не отправляете ЛЮБОЙ контент перед вызовом session_start
. Еще лучше, просто сделайте session_start
первое, что вы делаете в своем PHP-файле (так что поставьте его в абсолютном начале, перед всем HTML и т. Д.).
Используйте это сверху только после <?php
ob_start();
вы можете использовать вот так:
<?php ob_start(); session_start(); include 'your php file'; ... ...
PHP – это серверный язык, поэтому вы должны использовать javascript для перезагрузки страницы.
<script> function myFunction() { location.reload(); } </script>
Это перезагрузит текущую страницу.
Если вы хотите обновить страницу на стороне сервера: в простой php вы можете использовать функцию заголовка ( http://php.net/manual/ru/function.header.php ) для обновления текущей страницы.
header('Location: /'.$_SERVER["REQUEST_URI"]);
если вы хотите обновить страницу со стороны клиента, вы можете использовать:
location.reload()
(JavaScript)
Появляется только страница с белым backgroung, показывающим: Файл file.data загружен.
Это ваш код, который делает это:
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $targetFile)) { echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded."; } else { echo "Sorry, there was an error uploading your file."; } ob_end_flush(); include("fileform.php");
Причина, по которой вы впоследствии получаете сообщение об ошибке, заключается в том, что вы должны вызывать session_start () где-то после ob_end_flush (), но это не отображается ни в одном из кода, который вы нам показали. т.е. код, который вы нам показали, не приведет к ошибке, которую вы указали.
По совпадению, несмотря на то, что код выше наносится ob_end_flush () (без видимой причины), нет ob_start (). Это может появиться в коде, который вы нам не показали.
Вы можете перезагрузить одну и ту же страницу, перенаправив ее на тот же URL.
<?php redirect(your_url); ?>
Я делаю что-то не так в файле upload.php, но я не знаю, что именно не так
Проблема, с которой вы сталкиваетесь, – это классика.
В скрипте fileform.php
вы вызываете session_start()
(через login.php
). Это не работает после загрузки файла, потому что в сценарии загрузки, который вы написали в тело ответа HTTP через echo
:
session_start()
должен писать заголовки HTTP. поскольку заголовки уже отправлены session_start()
не могут выполнять свою работу.
Именно это сообщение об ошибке пытается сказать:
Предупреждение: session_start () [function.session-start]: не удается отправить ограничитель кеша сеанса – уже отправленные заголовки (вывод запущен на /var/www/upload.php:40) в /var/www/login.php в строке 4
–
как это исправить
Вам необходимо будет реорганизовать сценарий загрузки, чтобы вы include('fileform.php')
перед отправкой любого другого содержимого в тело ответа.
<?php // .. do not echo anything include('fileform.php'); // .. do the file upload stuff.
в<?php // .. do not echo anything include('fileform.php'); // .. do the file upload stuff.
Примечание: если вы попытаетесь перенаправить после echo
вы столкнетесь с той же проблемой, что и session_start()
поскольку перенаправление HTTP требует записи заголовков ответов.