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のようなソフトウェアを使用して正しく抽出してもそれらをインクルードする必要はありません。
ありがとうございました! BufferedReaderとバッファリングされていないストリームで動作することについてはわかりませんでした。 – user2513924