无法在Windows

时间:2017-02-17 21:01:18

标签: php xml linux windows 7zip

服务器环境:

  • Linux RHEL5 x86_64,Apache,PHP

客户端环境:

  • Windows 10 64位(VirtualBox MacOS主机),4GB Ram,30GB可用空间,浏览器IE11(也使用Edge / Firefox测试),7zip

方案如下:

  • 我通过浏览器上传一个zip(存档中有一个2.5GB的文件)到我的PHP Web服务器,当邮件到达服务器端时SHA2校验和匹配
  • 我在服务器上解压缩zip,根据里面的文件生成XML文件,然后将XML文件添加回原始zip。例如:$xml->addFromString("hello.xml", $xmldata);
  • 然后关闭zip并让用户下载zip文件。

问题在于,当我尝试打开下载的zip时,我添加的xml是"缺少",7zip报告there are data after the payload。如果我在服务器端解压缩完全相同的拉链,一切都在那里...如果我scp拉链到我的本地机器,然后转移到我的Windows机器,并在那里打开它,它也很好...

这让我想到,我设置的标题可能是错的......我尝试了各种不同的方式,但仍然无法解决它......这是最新的标题我有......

ob_start();
header("Content-type: application/octet-stream");
header("Content-Transfer-Encoding: binary");
header('Content-Length: ' . filesize($filename));
header("Content-Disposition: attachment; filename=\"$filename\"");
while (ob_get_level()) {
   ob_end_clean();
}
readfile($filename);

我也试过了application/zip,但也无法工作。

更新

因此,如果我通过浏览器(IE11)下载zip文件,则文件的校验和与服务器上生成的zip不同...如果我scp从服务器到本地的邮件,然后是校验和它,它们匹配...所以看起来在转移过程中有一些东西打破了拉链但这只发生在拉链内的大文件中。

有人能告诉我为什么这个巨大的文件有不同的属性stor?为什么我添加的xml有0.0 fat而其他人有6.3

less 123456.zip
-rw-a--     6.3 fat      140 bx defN  3-Feb-16 12:22 123456/CONFIG.LDR
-rw-a--     6.3 fat      140 bx defN  8-Apr-16 10:55 123456/FILES.LUM
-rw-a--     6.3 fat      100 bx defN  3-Feb-16 12:23 123456/LOADS.LUM
-rw-a--     6.3 fat 2621440000 bx stor 16-Feb-17 15:09 123456/huge.lup
-rw-a--     6.3 fat      142 bx defN  3-Feb-16 12:23 123456/PBA123456.LUH
-rw----     0.0 fat    25196 b- defN 17-Feb-17 16:13 123456/crate.xml
6 files, 2621465718 bytes uncompressed, 2621451952 bytes compressed:  0.0%

我注意到在通过浏览器下载文件后丢失了大文件后的所有内容(例如:LUH和xml)。

UPDATE2:

好的,这很疯狂......所以我用unzip解压缩了linux上的zip,然后使用zip重新打包,并通过浏览器以相同的方式下载文件。我现在在档案中丢失了不同的文件......这绝对是零感觉!

在我解压缩并重新打包之后,我得到了以下内容,在Windows中无法查看大文件后的所有内容。

drwxr-xr-x  2.3 unx        0 bx stor 17-Feb-17 17:03 123456/
-rw-r--r--  2.3 unx      140 bx defN  8-Apr-16 10:55 123456/FILES.LUM
-rw-r--r--  2.3 unx      142 bx defN  3-Feb-16 12:23 123456/PBA123456.LUH
-rw-r--r--  2.3 unx    25196 tx defN 17-Feb-17 16:51 123456/crate.xml
-rw-r--r--  2.3 unx 2621440000 bx defN 16-Feb-17 15:09 123456/huge.lup
-rw-r--r--  2.3 unx      100 bx defN  3-Feb-16 12:23 123456/LOADS.LUM
-rw-r--r--  2.3 unx      140 tx defN  3-Feb-16 12:22 123456/CONFIG.LDR

1 个答案:

答案 0 :(得分:2)

PHP readfile()可能会出现大文件问题。请尝试使用stream_copy_to_stream():

set_time_limit(0);
$stdout = fopen('php://output', 'w');
$bfname = basename($fname);

header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"$bfname\"");

$filein = fopen($fname, 'r');
stream_copy_to_stream($filein, $stdout);

fclose($filein);
fclose($stdout);