【问题标题】:Refresh a php page after uploading a file上传文件后刷新一个php页面
【发布时间】:2014-12-04 17:40:36
【问题描述】:

我需要使用 PHP 和 HTML 表单将文件上传到服务器。

我使用了 w3school 的示例:PHP 5 File Upload,这对我很有帮助。

当然,为了解决我的问题,我需要修改该代码,所以情况是这样的:

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 页面。 它只出现一个带有白色背景的页面:

文件file.data已上传。

警告:session_start() [function.session-start]:无法发送会话缓存限制器 - 已在 /var/www/login 中发送标头(输出开始于 /var/www/upload.php:40) .php 在第 4 行

带有PHP页面的一些图标...

我很确定我在 upload.php 文件中做错了什么,但我不知道究竟是什么问题以及如何修复它。

如何更改代码才能正确重新加载 PHP 页面?

提前感谢您的帮助。

【问题讨论】:

  • 被提名重新开放 - 上面的 session_start() 哪里写的?
  • @symcbean Errr... 有问题吗? Warning: session_start() [function.session-start]: Cannot send session cache limiter......粗体 字母表示。问题应该保持关闭。它甚至在下面的答案中。
  • 在所有这些回答之后,我必须感谢你们的建设性回答和帮助。但是,我按照 Rohit Jindal 的建议修改了代码(这似乎是最明确的代码示例)并且它可以工作。好吧,页面重新加载并没有达到应有的效果,但也许这只是另一个需要解决的问题。
  • @Fred:它只出现在错误消息中 - 不在代码中。虽然可以在不显式调用会话启动的情况下进行会话(如果您在 .ini 文件中设置 session.auto_start ),但您不会得到引用的错误。这里显示的代码没有产生这里显示的错误。

标签: php file-upload


【解决方案1】:

“标头已发送”表示您的 PHP 脚本已经发送了 HTTP 标头,因此现在无法对其进行修改。

在致电session_start 之前,请确保您没有发送任何内容。更好的是,只需将session_start 作为您在 PHP 文件中执行的第一件事(所以将其放在绝对开头,在所有 HTML 等之前)。

&lt;?php之后的顶部使用这个

ob_start();

你可以这样使用:

<?php
ob_start();
session_start();

include 'your php file';

...
...

【讨论】:

    【解决方案2】:

    PHP 是一种服务器端语言,因此您应该使用 javascript 重新加载页面。

    <script>
    function myFunction() {
        location.reload();
    }
    </script>
    

    这将重新加载当前页面。

    【讨论】:

      【解决方案3】:

      如果你想在服务器端刷新页面: 在普通的 php 中,你可以使用 header 函数 (http://php.net/manual/ru/function.header.php) 来刷新当前页面。

      header('Location: /'.$_SERVER["REQUEST_URI"]);
      

      如果你想在客户端刷新页面,你可以使用:

      location.reload()
      

      (javascript)

      【讨论】:

        【解决方案4】:

        只出现一个白色背景的页面显示:文件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");
        

        您随后收到错误的原因是您必须在 ob_end_flush() 之后的某处调用 session_start() - 但这不会出现在您向我们展示的任何代码中。即您向我们展示的代码不会产生您引用的错误。

        巧合的是,尽管上面的代码充满了 ob_end_flush()(没有明显的原因),但没有 ob_start()。这可能会出现在您未向我们展示的代码中。

        【讨论】:

          【解决方案5】:

          您可以通过重定向到相同的 url 来重新加载相同的页面。

          <?php
          redirect(your_url);
          ?>
          

          【讨论】:

            【解决方案6】:

            我在 upload.php 文件中做错了,但我不知道到底是什么问题

            你遇到的问题很经典。

            在您的fileform.php 脚本中,您正在调用session_start()(通过login.php)。这在文件上传后不起作用,因为在上传脚本中,您已通过 echo 写入 HTTP 响应正文:

            session_start() 需要编写 HTTP 标头。因为标头已经发送 session_start() 无法完成它的工作。

            这就是这条错误信息想要表达的意思:

            警告:session_start() [function.session-start]:无法发送会话缓存限制器 - 已在 /var/www/login 中发送标头(输出开始于 /var/www/upload.php:40) .php 在第 4 行

            -

            如何解决

            您需要重构您的上传脚本,以便在将任何其他内容发送到响应正文之前include('fileform.php')

            <?php
            // .. do not echo anything
            include('fileform.php');
            // .. do the file upload stuff.
            

            注意:如果您尝试在 echo 之后进行重定向,您将遇到与 session_start() 相同的问题,因为 HTTP 重定向需要编写响应标头。

            【讨论】:

              猜你喜欢
              • 2018-08-20
              • 1970-01-01
              • 1970-01-01
              • 2011-08-22
              • 2016-07-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多