2012-06-17 5 views
-2

가능한 중복 : 나는 자바 응용 프로그램에서 이진 파일을 업로드하고 PHP 스크립트를 통해 처리하기 위해 노력하고있어
Headers already sent by PHPPHP는 "헤더 정보를 수정할 수 없습니다 - 이미 보낸 헤더를"

서버 측.

그러나 이클립스 (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> 
    "; 
} 

>

그리고 여기 내 자바 측 코드입니다 :

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

바이트 = 8,804,659
경고을 양도 : 알 수 없음 : 8,804,659 바이트 POST의 콘텐츠 길이가
라인 0
알 수없는에서 8,388,608 바이트의 제한을 초과 경고
: 헤더 정보를 수정할 수 없습니다 - 헤더가 이미 경고 라인 0

알 수없는 전송 : 칸 OT는 헤더 정보를 수정할 - 헤더가 이미 C로 전송 : \ WAMP \ www가 \ 행에 testhttpfileupload3.php 2

공지 사항 : 정의되지 않은 변수 : C에서 파일 이름 : \ WAMP \ www가 \ testhttpfileupload3.php 라인34

공지 : 정의되지 않은 변수 : 의 청크 C : \ WAMP \ WWW \ 라인 testhttpfileupload3.php 34
012 3,516,
경고 :는 fopen (./ uploaded_file) function.fopen] : 그런 파일이나 디렉토리 C에서 : 스트림을 열지 못했다 \ WAMP \ www가 \ 행에 testhttpfileupload3.php 34

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

답변

2

display_errors을 해제하는 중입니다).

header 호출 전에 경고 Unknown: POST Content-Length of 8804659 bytes exceeds the limit of 8388608 bytes in Unknown on line 0이 출력되고있어 작동하지 않습니다.

당신은 php.ini (display_startup_errors)에 숨겨진 MAX_FILE_SIZE 입력 필드 1 또는 비활성화 시작 오류를 사용, 최대 허용 크기를 증가 중 하나가 필요합니다. 생산 오류 표시는 어쨌든 꺼야합니다. 그러나 주된 문제는 PHP가 허용하는 것보다 큰 파일을 업로드하려고 시도한다는 것입니다. 따라서 오류가 없어도 파일 업로드가 완료되지 않습니다.

+0

thnx sooo much ... 당신 말이 맞아요 .... 경고 메시지가 초기 헤더로 전송되고 있습니다 ... –

+0

시작 오류가 흔하지 않지만, 하지만 코드가 실행되기 전에 코드가 실행되기 전에 코드가 실행됩니다.이 코드는 여기서 발생합니다. 기꺼이 도와주세요. – drew010

1

작성된 경고 메시지로 인해 초기 HTTP 헤더가 전송됩니다. 이후에 제공하는 헤더 명령은 이미 경고를 출력 했으므로 더 이상 작동하지 않습니다.

솔루션 포스트 업로드 제한을 변경하거나 코드 중 하나가 실행되기 전에 가상의 선 영 (에 출력되는 PHP 시작 오류를 발생하는 것 같습니다 php.ini

+0

괜찮아요 ... thnx sooo much :-) –

관련 문제