-2

重複の可能性:
PHP によって既に送信されたヘッダー

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>
    ";
}

?>

そして、ここに私の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

byte Transferred = 8804659
警告: 不明: 8804659 バイトの POST コンテンツ長が行0の不明で 8388608 バイトの制限を超えています警告: ヘッダー情報を変更できません -行0の不明で既に送信されたヘッダー警告: ヘッダー情報を変更できません - ヘッダーは既にあります2行目のC:\wamp\www\testhttpfileupload3.phpで送信されます注意: 未定義の変数: C:\wamp\www\testhttpfileupload3.phpの fileName行34注意: 未定義の変数: C:\wamp\www\testhttpfileupload3のチャンク34行目の.php









警告: fopen(./uploaded_file) [function.fopen]: ストリームを開くことができませんでした: 34行目のC:\wamp\www\testhttpfileupload3.phpにそのようなファイルまたはディレクトリはありません

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

2 に答える 2

2

PHP 起動エラーが発生しているようです。このエラーは、架空の行 0 (コードが実行される前) に出力されます。

呼び出しの前に警告Unknown: POST Content-Length of 8804659 bytes exceeds the limit of 8388608 bytes in Unknown on line 0が出力されているため、それが機能しません。header

最大許容サイズを増やすか、非表示のMAX_FILE_SIZE入力フィールド1php.iniを使用するか、 (display_startup_errors)で起動エラーを無効にする必要があります。いずれにせよ、本番環境ではエラー表示をオフにする必要があります。しかし、主な問題は、PHP が許可するように設定されているよりも大きなファイルをアップロードしようとしていることです。そのため、そのエラーがなくても、ファイルのアップロードは不完全です。

于 2012-06-17T07:28:53.723 に答える
1

書き出された警告メッセージにより、最初の http ヘッダーが送信されます。後で指定するヘッダー コマンドは、既にその警告を出力しているため、機能しません。

解決策は、投稿のアップロード制限を変更するか、無効display_errorsにすることですphp.ini

于 2012-06-17T07:28:38.223 に答える