2010-06-20 36 views
16

Tôi có một tập lệnh PHP để tạo tệp zip khi đang di chuyển và buộc trình duyệt tải xuống tệp zip. Câu hỏi đặt ra là: tôi có thể trực tiếp ghi tệp zip vào luồng đầu ra được kết nối với trình duyệt của người dùng thay vì lưu nó dưới dạng tệp thực sự trên máy chủ trước và sau đó gửi tệp không?Dòng Zip trong PHP

Xin cảm ơn trước.

+1

Câu trả lời cho câu hỏi này là ở đây: http://stackoverflow.com/a/4357904/416630 – Lee

Trả lời

5

Nếu bạn đang sử dụng zip extension, câu trả lời có vẻ là "không". Các close method in the ZipArchive class là những gì gây nên một viết, và có vẻ như muốn viết vào một tập tin. Bạn có thể có một số may mắn bằng cách sử dụng Streams để mô phỏng tệp, nhưng sau đó bạn giữ toàn bộ nội dung trong bộ nhớ và bạn vẫn không thể gửi nó cho đến khi bạn hoàn tất việc thêm tệp.

Nếu bạn đang gặp vấn đề với timeout hoặc các vấn đề khác trong khi có một chờ đợi người dùng cho tập tin zip được tạo ra, hãy thử một quá trình tải về nhiều bước:

  1. chọn tài khoản bất cứ điều gì họ chọn để tạo ra các zip
  2. Chúng được đưa đến trang trạng thái sử dụng cuộc gọi ajax để thực sự tạo tệp zip trong nền. Một hình ảnh động khá mất tập trung nên giữ sự chú ý của họ.
  3. Sau khi quy trình nền tạo mã zip, người dùng được chuyển hướng đến tập lệnh thực hiện tải xuống/chuyển hướng đến tệp.
-1

Không, bạn phải sử dụng tệp tạm thời, như trong here.

11

Nếu máy chủ web của bạn đang chạy Linux, thì bạn có thể làm điều đó trực tuyến mà không có một tập tin tạm thời được tạo ra. Dưới win32 bạn có thể cần phải sử dụng Cygwin hoặc một cái gì đó tương tự.

Nếu bạn sử dụng "-" làm tên tệp zip, tệp sẽ nén thành giá trị chuẩn. Từ đó, bạn có thể dễ dàng chuyển hướng luồng đó bằng popen(). Đối số "-q" chỉ yêu cầu mã zip không xuất ra văn bản trạng thái bình thường. Xem manpage zip (1) để biết thêm thông tin.

<? 
    $zipfilename = "zip_file_name.zip"; 

    if(isset($files)) unset($files); 

    $target = "/some/directory/of/files/you/want/to/zip"; 

    $d = dir($target); 

    while(false !== ($entry = $d->read())) 
    { 
     if(substr($entry, 0, 1) != "." && !is_dir($entry)) 
     { 
     $files[] = $entry; 
     } 
    } 

    header("Content-Type: application/x-zip"); 
    header("Content-Disposition: attachment; filename=\"$zipfilename\""); 

    $filespec = ""; 

    foreach($files as $entry) 
    { 
     $filespec .= "\"$entry\" "; 
    } 

    chdir($target); 

    $stream = popen("/usr/bin/zip -q - $filespec", "r"); 

    if($stream) 
    { 
     fpassthru($stream); 
     fclose($stream); 
    } 
?> 
1

Có, bạn có thể trực tiếp dòng zip cho khách hàng sử dụng git này đại diện: Zip Stream Large Files

+0

Dường như không hoạt động trong cửa sổ – Jerry

Các vấn đề liên quan