2017-02-17 7 views
1

Server環境に大きなLinuxのzip形式のアーカイブを解凍することができません:Windowsで

  • LinuxのRHEL5 x86_64では、Apache、PHPを

クライアント環境:

  • のWindows 10 64ビット(VirtualBoxのMacOSのホスト)、4GBのRAM、30GBの空き容量、ブラウザIE11(Edge/Firefoxでもテスト済み)、7zip

シナリオは以下の通りです:

  • ジッパーはサーバ側
  • に到着したとき、私は、私のPHPのWebサーバにブラウザを介して(2.5ギガバイトであるアーカイブ内のファイルがある)SHA2チェックサムが一致するzipファイルをアップロード
  • サーバ上でzipを解凍し、内部のファイルに基づいてXMLファイルを生成し、元のzipにXMLファイルを戻します。例:$xml->addFromString("hello.xml", $xmldata);
  • 次に、zipを閉じて、ユーザーにzipファイルをダウンロードさせます。

問題は、ダウンロードしたzipを開こうとすると、xmlを追加すると "missing"と表示され、7zipはthere are data after the payloadと報告しています。私がサーバ側で全く同じzipを解凍すれば、すべてがそこにあります... 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)ことに気づいファイルはブラウザ経由でダウンロードされた後、巨大なファイルの後には失われます。

アップデート2:

[OK]を、これは非常識です...ので、私は、ブラウザを介して同じようにzipを使用してそれを再梱包してファイルをダウンロードし、その後unzipでLinux上で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

ファイルサイズはこの問題で本当に重要ですか?読者が作業できる100バイトのテストケースを作成します。がんばろう。 – shellter

+0

それは問題ですが、小さなファイルで問題なく動作します。それは、転送がzipの中の巨大なファイルで行われるときはいつものように見えます。元の質問を追加情報で更新しました。 – codenamezero

+0

申し訳ありませんが、私はこれについて手伝ってもらえないと思います。あなたのQを大幅に改善したので、私はupvotedして、それは素晴らしいパズルです。誰かを願って 'php'の達人があなたを助けることができます。うーん。あなたが示したように 'unzip -t file'を' less'で見たことはありませんでした。 'less'のバージョン#では何を得るのですか?ありがとう、幸運。 – shellter

答えて

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); 
+0

これはそれを修正!!!! MIND = BLOWN !!! – codenamezero

関連する問題