2016-07-09 34 views
2

HTTPとPHPを使用してJavaを使用してzipファイルをダウンロードします。私は、ユーザにダウンロードさせる前にPHPに何らかの承認をする必要があるので、これが必要です。JavaのPHP readfile()からzipファイルをダウンロード

認証が成功した場合、ページはこのコードを使用してファイルを送信します。

if(file_exists($filename)){ 

    //Use Content-Disposition: attachment to specify the filename 
    header("Content-type: application/zip"); 
    header('Content-Disposition: attachment; filename='.basename($filename)); 

    //No cache 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate'); 
    header('Pragma: public'); 

    //Define file size 
    header('Content-Length: ' . filesize($filename)); 
    ob_clean(); 
    flush(); 
    echo "DOWNLOAD_START\r\n"; 
    readfile($filename); 
    exit; 
}else{ 
    clearstatcache(); 
    echo "No download available."; 
} 

ブラウザを介してダウンロードする際、ダウンロードが正常に動作します。私はそれを抽出しようとしているsimplyingでうまく動作するかどうかを確認します。 Javaアプリケーションが破損したバージョンを生成します。

このページではヘッダー情報も出力されるため、Zipファイルの開始時に「DOWNLOAD_START \ r \ n」と表示されます。 ZIPファイルをダウンロードするコードは次のとおりです。

InputStream sockin = keygenSock.getInputStream(); 
BufferedReader reader = new BufferedReader(new InputStreamReader(sockin)); 
System.out.println("Reading..."); 
for(String line = reader.readLine(); line != null; line = reader.readLine()){ 
    System.out.println(line); 
    if(line.startsWith("DOWNLOAD_START")){ 
     BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File("contents.zip"))); 
     int read; 
     int size = 0; 
     byte[] buffer = new byte[2048]; 
     while((read = sockin.read(buffer, 0, 2048)) >= 0){ 
      size += read; 
      bos.write(buffer, 0, read); 
     } 
     System.out.println("SIZE READ: " + size); 
     bos.flush(); 
     bos.close(); 
     //zip(sockin); 
     break; 
    } 
} 

読み取られる実際のバイト数は、実際のファイルサイズ(バイト数)と同じではありません。だから私はZIPファイルをダウンロードしている途中にエラーがあると思っていますか?

承認後にページからzipファイルをダウンロードするにはどうすればよいですか?

また、ダウンロードしたZIPファイルが実際のZIPファイルよりも小さいというエラーがあります。

ありがとうございました。

EDIT:出力のすべてのをzipファイルにダンプするだけで、winRARを使用して抽出することができます。ただし、テキストエディタで開くと、実際のzipファイルの前にすべてのヘッダー情報と「DOWNLOAD_START」が表示されます。これにより、Javaのunzipクラス(ZipInputStreamおよびZipEntry)が失敗するので、winRARのようなソフトウェアを使用して正しく抽出してもそれらをインクルードする必要はありません。

答えて

1

問題はBufferedReaderで、ストリームから単一行以上のものを読み込み/消費します。

バッファされていないリーダーを使用するか、つまり、readlineメソッドはありません。

StringBuilder line = new StringBuilder(); 
int character; 
while ((character = reader.read()) >= 0 && character != '\n') { 
    line.append(character); 
} 

また、InputStreamでも同じことを使用してください。

StringBuilder line = new StringBuilder(); 
int character; 
while ((character = stream.read()) >= 0 && character != '\n') { 
    line.append(character); 
} 

両方の行には\ rが含まれています(それに応じてコードを変更します)。使用されているエンコーディングが下位の127バイトを混乱させない限り、いずれにしてもうまくいくはずです。

+0

ありがとうございました! BufferedReaderとバッファリングされていないストリームで動作することについてはわかりませんでした。 – user2513924