gpt4 book ai didi

java - 在 Java 中从 PHP readfile() 下载一个 zip 文件

转载 作者:行者123 更新时间:2023-11-30 10:42:02 24 4
gpt4 key购买 nike

我想通过 HTTP 和 PHP 使用 Java 下载一个 zip 文件。我需要这个,因为我需要 PHP 在让用户下载之前进行一些授权。

授权成功后,页面使用以下代码发送文件:

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

通过浏览器下载时下载工作正常。我通过简单地尝试提取它来验证它是否正常工作。 Java 应用程序生成损坏的版本。

因为页面也输出标题信息,所以我回显“DOWNLOAD_START\r\n”以表示 zip 文件何时开始。下载 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 文件的方式有误?

如何让Java客户端在授权后从页面下载zip文件?

同样,错误是下载的 ZIP 文件小于实际的 ZIP 文件。

谢谢。

编辑:如果我只是将输出的所有 转储到zip 文件中,我就可以使用winRAR 将其解压缩。但是,如果我在文本编辑器中打开它,我可以在实际 zi​​p 文件之前看到所有标题信息和“DOWNLOAD_START”。这会导致 Java 解压缩类(ZipInputStream 和 ZipEntry)失败,因此即使它使用 winRAR 等软件正确解压缩,我也不需要包含这些类。

最佳答案

问题出在 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 字节,您应该没问题。

关于java - 在 Java 中从 PHP readfile() 下载一个 zip 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38285264/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com