Java php“;无法修改标题信息-标题已发送";

Java php“;无法修改标题信息-标题已发送";,java,php,file-upload,Java,Php,File Upload,可能重复: 我试图从Java应用程序上传一个二进制文件,并通过服务器端的php脚本处理它 但当我在Eclipse(用于Java)中运行代码时,它显示了以下日志 虽然我在第一行发送标题信息,但为什么它会显示此消息 以下是我的php代码: <?php header('Content-type: application/xml'); /*******************************************/ $DIRECTORY_SEPARATOR = "/"; $BUF_S

可能重复:

我试图从Java应用程序上传一个二进制文件,并通过服务器端的php脚本处理它

但当我在Eclipse(用于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>
    ";
}
下面是错误日志:

传输的字节=8802304

传输的字节=8804659
警告:未知:第0行中8804659字节的帖子内容长度超过了未知中8388608字节的限制

警告:无法修改标题信息-第0行中已发送的标题未知

警告:无法修改标题信息-标题已在第2行的C:\wamp\www\testhttpfileupload3.php中发送

注意:未定义的变量:第34行C:\wamp\www\testhttpfileupload3.php中的文件名

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

警告:fopen(./upload_file)[function.fopen]:无法打开流:第34行的C:\wamp\www\testhttpfileupload3.php中没有此类文件或目录


好啊

写入的警告消息会导致初始http头被发送。由于您已经输出了该警告,因此您随后发出的header命令不再有效


解决方案是更改上传后的限制,或者在
php.ini

中禁用
display\u errors
,看起来您遇到了php启动错误,该错误在假想的第0行输出(在执行任何代码之前)

警告
Unknown:8804659字节的POST内容长度超过了第0行中未知的8388608字节的限制
标题
调用之前被输出,因此它阻止了该操作


您需要增加允许的最大大小,使用隐藏的
MAX\u FILE\u SIZE
输入字段,或者在
php.ini
中禁用启动错误(显示启动错误)。生产中的错误显示仍应关闭。但主要问题是,您试图上载的文件比PHP设置的允许文件大,因此即使没有该错误,文件上载也将是不完整的。

thnx太多了……我想您是对的……警告消息作为初始标题发送……启动错误并不常见,但一旦发生,它们发生在执行任何代码之前,这就是这里发生的情况。很高兴能帮上忙。好吧,开始吧……太多了:-)
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();
        }
    }
}
    <?xml version="1.0" encoding="UTF-8"?>
    <data>
      <status type="file_upload">
            <value>ok</value>
      </status>
    </data>