【问题标题】:php "Cannot modify header information - headers already sent" [duplicate]php“无法修改标头信息-标头已发送” [重复]
【发布时间】:2012-06-19 15:23:59
【问题描述】:

可能重复:
Headers already sent by PHP

我正在尝试从 Java 应用程序上传二进制文件并通过服务器端的 php 脚本处理它。

但是当我在 Eclipse (for Java) 中运行代码时,它会显示以下日志。

虽然我在第一行发送标题信息,但为什么会显示此消息。

这是我的 php 代码:

<?php
header('Content-type: application/xml');

/*******************************************/
$DIRECTORY_SEPARATOR = "/";
$BUF_SIZE = 4096;

/*******************************************/
uploadFile();
sendResponse();

/*******************************************/
function uploadFile()
{
    global $DIRECTORY_SEPARATOR;
    global $BUF_SIZE;
    $targetDir = "." . $DIRECTORY_SEPARATOR . "uploaded_file";

    /***************************************/
    // 5 minutes execution time
    @set_time_limit(5 * 60);

    /***************************************/
    // Set filename
    $filename="temp_aa.mp3";

    /***************************************/
    if (!file_exists($targetDir))
    {
        mkdir($targetDir,0777,true);
    }

    /***************************************/
    $out = fopen($targetDir . DIRECTORY_SEPARATOR . $fileName, $chunk == 0 ? "wb" : "ab");
    if ($out) 
    {
        $in = fopen("php://input", "rb");
        if ($in) 
        {
            while ($buff = fread($in, $BUF_SIZE))
            {
                fwrite($out, $buff);
            }

            fclose($in);
        } 
        else
        {
            fclose($out);
            return ;
        }
    } 
    else
    {
        return ;
    }
}

function sendResponse()
{
    echo "
    <?xml version=\"1.0\" encoding=\"UTF-8\"?>
    <data>
      <status type=\"file_upload\">
            <value>ok</value>
      </status>
    </data>
    ";
}

?>

这是我的 Java 端代码:

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;


public class TestHttp 
{
    public static void main(String[] args)
    {
        HttpURLConnection httpUrlConnection = null;
        File mFileToUpload = new File("c:/aa.mp3");
        int byteTrasferred = 0, mBufferSize = 4096, mTempBytesRead = 0;
        byte[] mBuffer = new byte[mBufferSize];

        try
        {
            httpUrlConnection = (HttpURLConnection)new URL("http://127.0.0.1/testhttpfileupload3.php").openConnection();
            httpUrlConnection.setDoOutput(true);
            httpUrlConnection.setRequestMethod("POST");
            OutputStream os = httpUrlConnection.getOutputStream();
            Thread.sleep(1000);
            BufferedInputStream fis = new BufferedInputStream(new FileInputStream(mFileToUpload));

            while((mTempBytesRead = fis.read(mBuffer)) != -1) 
            {
                os.write(mBuffer, 0, mTempBytesRead);

                byteTrasferred += mTempBytesRead;
                System.out.println("byteTrasferred = " + byteTrasferred);
            }

            fis.close();
            os.close();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

        try
        {
            BufferedReader in = new BufferedReader(new InputStreamReader(httpUrlConnection.getInputStream()));

            String s = null;
            while ((s = in.readLine()) != null) 
            {
                System.out.println(s);
            }
            in.close();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}

这是错误日志:

字节传输 = 8802304

字节传输 = 8804659
警告:未知:8804659 字节的 POST 内容长度超出了 0Unknown 中 8388608 字节的限制0
警告:无法修改标头信息 - 标头已在 0Unknown 中发送

警告: 无法修改标头信息 - 标头已在 C:\wamp\www\testhttpfileupload3.php2

通知中发送/b>:未定义的变量:C:\wamp\www\testhttpfileupload3.php 中的文件名 34

注意 : 未定义变量:C:\wamp\www\testhttpfileupload3.php 中的块 34

警告 行:fopen( ./uploaded_file) [function.fopen]: 无法打开流: C:\wamp\www\testhttpfileupload3.php34

    <?xml version="1.0" encoding="UTF-8"?>
    <data>
      <status type="file_upload">
            <value>ok</value>
      </status>
    </data>

【问题讨论】:

    标签: java php file-upload


    【解决方案1】:

    写出的警告消息会导致发送初始 http 标头。之后您给出的标头命令不再起作用,因为您已经输出了该警告。

    解决方案是要么更改帖子上传限制,要么在php.ini 中禁用display_errors

    【讨论】:

    • 好吧,去吧...thnx sooo much :-)
    【解决方案2】:

    您似乎遇到了 PHP 启动错误,该错误在假想的第 0 行(在执行任何代码之前)输出。

    警告 Unknown: POST Content-Length of 8804659 bytes exceeds the limit of 8388608 bytes in Unknown on line 0header 调用之前输出,因此它阻止了它的工作。

    您需要增加最大允许大小,使用隐藏的MAX_FILE_SIZE 输入字段1,或者禁用php.ini 中的启动错误(display_startup_errors)。在生产中,无论如何都应该关闭错误显示。但主要问题是您尝试上传的文件大于 PHP 设置允许的大小,因此即使没有该错误,文件上传也会不完整。

    【讨论】:

    • thnx sooo much...我想你是对的...警告消息正在作为初始标头发送...
    • 启动错误并不常见,但是当它们确实发生时,它们会在您的任何代码执行之前发生,这就是这里发生的情况。很乐意提供帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    相关资源
    最近更新 更多