2014-09-03 4 views
1

Я создаю ZIP-файл с несколькими сценариями в нем (например: test.php, functions.js и style.css).PHP создать и загрузить ZIP на лету

Скрипты прекрасно работают, единственная проблема заключается в том, что ZIP-файл размещается на моем веб-сервере. Есть ли способ предотвратить это? Я читал несколько похожих вопросов: this one, похоже, работает, но я не могу понять, как это использовать.

Итак, я не могу удалить файл после его размещения (даже если пользователь его прервал) или (что еще лучше), что мои сценарии никогда не помещают файл на веб-сервер.

download.php

$scriptId = checkNumeric($_GET['sid']); 

//Check if user has access to the script 
if(isLoggedIn() && hasScriptAccess($scriptId)) { 

    //Create ZIP 
    $zip = new ZipArchive(); 
    $zipName = "script.zip"; 

    if ($zip->open($zipName, ZIPARCHIVE::CREATE)!== TRUE) { 
     exit(); //Something went wrong while creating the ZIP 
    } 

    //Get associated codes 
    $query = $mysqli->query("SELECT * FROM code WHERE script_id = '{$scriptId}'"); 
    while($code = $query->fetch_assoc()) { 
     $filename = $code['title']; 
     $content = $code['code']; 

     //Add file to ZIP 
     $zip->addFromString($filename, $content); 
    } 

    $zip->close(); 

    //Set headers 
    header("Pragma: public"); 
    header("Expires: 0"); 
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
    header("Cache-Control: public"); 
    header("Content-Description: File Transfer"); 
    header("Content-type: application/octet-stream"); 
    header("Content-Disposition: attachment; filename='" . $zipName . "'"); 
    header("Content-Transfer-Encoding: binary"); 
    header("Content-Length: " . filesize($zipName)); 

    clearstatcache(); //Make sure the file size isn't cached 
    readfile($zipName); //Output the file 
    $zip->deleteName($zipName); 
} 
+1

Возможно ли запланировать задание cron на вашем сервере, которое очищает каталог, в котором хранятся файлы с заданным интервалом? – Crackertastic

+0

Вы имеете в виду работу cron, которая удалит сохраненные файлы через определенное количество времени? Я думаю, что это возможно, но это не лучшее решение? – JasonK

+0

Да, вот что я имею в виду. Cron мог запустить скрипт, чтобы очистить этот каталог как любой временной интервал, который вы указали. Я понимаю, что вы не хотите хранить файлы на сервере, но они должны будут существовать в течение короткого периода времени, если вы предлагаете загрузку. В прошлом я столкнулся с аналогичной ситуацией, когда мне нужно было время от времени удалять zip-файлы, но не удалось установить задания cron. В итоге мне пришлось программировать функциональность, которая иногда запускается как часть обычного трафика сайта. – Crackertastic

ответ

0

Из моего понимания почтового файл должен быть сохранен, он не может быть сохранен в памяти. $ Zip-> близко(); это то, что фактически запускает создание файла. Я уверен, что кто-то умнее, чем я пойму, как записать его в память, но пока есть простая работа.

Я просто сделал что-то подобное. Фокус в том, чтобы использовать:

// Keep script running even if user aborts 
ignore_user_abort(true); 

Добавьте это как первую строку вашего скрипта. Это позволяет запустить скрипт загрузки, даже если пользователь прерывает загрузку. Это обеспечит вызывание команды удаления.

Я не уверен, если вы говорите, что файл находится или не удаляется должным образом, даже если пользователь не прерывает. Но если текущая команда удаления не работает, как ожидался, вы можете использовать простой:

unlink($zipName); 

Надеется, что это помогает.

Смежные вопросы