服务器环境:
客户端环境:
方案如下:
$xml->addFromString("hello.xml", $xmldata);
问题在于,当我尝试打开下载的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
答案 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);