2011-11-04 2 views
0

안녕하세요. 해결할 수없는 문제가 있습니다. 내 Android \ java 애플리케이션에서 나는 download.php 스크립트를 호출한다. 기본적으로 출력에서 ​​파일을 다운로드하여 내 장치에 저장합니다. 기본적으로 스크립트에 토큰을 보내고 유효한지 검사하는 모든 PHP 스크립트에 컨트롤을 추가해야했습니다. 만약 그것이 유효한 토큰이라면 나는 문자열 ("false")을 반환하지 않으면 출력 (이 경우 다른 스크립트의 파일은 json 파일)을 얻을 것이다. java : php 출력을 검사하는 중 오류가 발생했습니다.

내가 그것을 문자열로 입력 스트림을 돌려 확인 IOUtils 방법을 사용하여 내 다른 자바 파일에이 조건을 확인하고,

InputStream newInputStream = new ByteArrayInputStream(mystring.getBytes("UTF-8")); 

보다 다시 유효한 입력 스트림을 얻고 읽어 .. 이 때문에 캘리포니아에서 내가 나는 그것이 생각 IOUtils.toString(inputStream, "UTF-8");

을하려고 할 때

11-04 16:50:31.074: ERROR/AndroidRuntime(32363): java.lang.OutOfMemoryError

: .... 내 JSON 파일과 함께 작동하지만이 경우 ...... 나는이 오류 정말 긴 파일을 다운로드하려고합니다.

fileOutput = new BufferedOutputStream(new FileOutputStream(file,false)); 
inputStream = new BufferedInputStream(conn.getInputStream()); 

String result = IOUtils.toString(inputStream, "UTF-8"); 
if(result.equals("false")) 
{ 
    return false; 
} 
else 
{ 
    Reader r = new InputStreamReader(MyMethods.stringToInputStream(result)); 
    int totalSize = conn.getContentLength(); 
    int downloadedSize = 0; 
    byte[] buffer = new byte[1024]; 
    int bufferLength = 0; 
    while ((bufferLength = inputStream.read(buffer)) > 0) 
    { 
     fileOutput.write(buffer, 0, bufferLength); 
      downloadedSize += bufferLength; 
} 
fileOutput.flush(); 
fileOutput.close(); 
+0

파일의 길이는 얼마입니까? – Mob

답변

1

시작하려면 문자열을 스트림으로 읽지 마십시오. 이진 데이터로 유지하고 처음 5 바이트 만 읽음으로써 시작하십시오. 그런 다음 5 바이트가 UTF-8에서 "false"를 인코딩하는 데 사용 된 5 바이트인지 여부를 확인할 수 있습니다. 그렇지 않으면 5 바이트를 출력 파일에 기록한 다음 이전과 동일한 루핑/읽기/쓰기를 수행하십시오. 이 5 바이트를 읽으려면 에 루프해야합니다 (가능성은 희박함). 아마도 귀하의 IOUtils 클래스는 "적어도 5 바이트를 읽으십시오"라고 말할 수 있습니다. 실제 내용이 보다 작 으면 5 바이트보다 작습니까?

솔직히 "false"가있는 본문 대신 응답의 헤더를 사용할 수 있다면 더 좋을 것입니다. PHP 스크립트를 제어하고 있습니까?

+0

물론 나는 그렇지만 나는 PHP가 좋지 않다. 내 스크립트 안에는 3 가지 출력이 있습니다. 1) print json_encode ($ something); 2) echo "false"3) readfile ($ file); 어떻게 헤더를 추가하여 어떤 종류의 출력을 처리 할 수 ​​있습니까? 이것은 최고의 솔루션이 될 것입니다 .... – Sgotenks

관련 문제