Как отдать файл на скачивание, и после скачивания стереть его с сервера?

bicyclist

Новичок
Или как можно просто удалить файл через определённое время после того, как его отдали на скачивание? Пробовал:
Код:
header('Location: /upload/outfitBlank/'.fileName.'.docx');
sleep(10);
unlink($_SERVER['DOCUMENT_ROOT'] . '/upload/outfitBlank/'.fileName.'.docx');
файл не начинает скачиваться, сразу выдаёт ошибку 404.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Можно услышать задачу?
 

bicyclist

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

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Ну так создавай файл на лету, просто стрим контента с нужными заголовками, и не надо будет придумывать хрен пойми что. Файл создается же тоже не пойми с чего, скриптом?
 

Тугай

Новичок
после header(,,,) файл не предается до оканчяания работы скрипата и ты его просто тут же удаляешь.

cron или через systemd, посмотри как сессии удаляются командой типа
find -O3 "$save_path/" -ignore_readdir_race -depth -mindepth 1 -name 'sess_*' -type f -cmin "+$gc_maxlifetime" -delete

или сам программируй свой find, выбирай все файлы в каталоге и удаляй старые по дате.
 
Последнее редактирование:

bicyclist

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

Тугай

Новичок
Location: ... - это ридеркт и браузер запросит этот адрес, на лету это как-то так

header('Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document');
header('Content-Disposition: attachment; filename="file.docx"');
readfile('/path/to/file.docx');
unlink('/path/to/file.docx');
 

WMix

герр M:)ller
Партнер клуба
на лету это это типо
PHP:
$file = fopen('php://output', 'w');
 

bicyclist

Новичок
а можно пример кода, как уже созданный файл скачать и удалить?
 

bicyclist

Новичок
Создаю файл с помощью phpword:
Код:
require_once($_SERVER['DOCUMENT_ROOT'] . '/phpword/vendor/autoload.php');
$document = new \PhpOffice\PhpWord\TemplateProcessor($_SERVER['DOCUMENT_ROOT'] . '/development_mr/word_table/template.docx');

$TableHeader = array('bold' => true);
$aligncenter = array('align'=>'center');

$table = new Table(array('borderSize' => 2, 'borderColor' => 'black', 'width' => '10000', 'unit' => TblWidth::TWIP));
$table->addRow();
$table->addCell(100, ['valign' => 'center'])->addText('№
п/п', $TableHeader, $aligncenter);
$table->addCell(3200, ['valign' => 'center'])->addText('Наименование мероприятий', $TableHeader, $aligncenter);
$table->addCell(1000, ['valign' => 'center'])->addText('Дата исполнения', $TableHeader, $aligncenter);
$table->addRow();
$table->addCell(100, ['align'=>'center', 'valign' => 'center'], $aligncenter)->addText($index, [], $aligncenter);
$table->addCell(3200, ['valign' => 'center'], $aligncenter)->addText('Ведение требуемого режима работы оборудования.');
$table->addCell(1000, ['align'=>'center', 'valign' => 'center'])->addText('Круглосуточно', [], $aligncenter);


$arResultDocOutfit = [];
$arResultDocOutfit['number'] = $number_true;
$arResultDocOutfit['date_1'] = $_REQUEST['DATE_FROM'];
$arResultDocOutfit['date_2'] = $_REQUEST['DATE_TO'];
$document -> setComplexBlock('table', $table);
$arResultDocOutfit['company'] = $companyName;
$arResultDocOutfit['gendir'] = $companyGenDir;

$document->setValues($arResultDocOutfit);

//$document->saveAs($_SERVER['DOCUMENT_ROOT'] . '/upload/outfitBlank/contract_'.$newPass.'.docx');
$document->save('php://output');
строка "$document->saveAs($_SERVER['DOCUMENT_ROOT'] . '/upload/outfitBlank/contract_'.$newPass.'.docx');" сохраняет файл нормально.
а строка "$document->save('php://output');" показывает пустую страницу и ничего не скачивает.
может, какие-то настройки сервера виноваты. что ещё можно попробовать?
 

bicyclist

Новичок
Location: ... - это ридеркт и браузер запросит этот адрес, на лету это как-то так

header('Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document');
header('Content-Disposition: attachment; filename="file.docx"');
readfile('/path/to/file.docx');
unlink('/path/to/file.docx');
Выводит ошибку и непонятный код типа:
: Non-static method api\agent::CompanyName() should not be called statically in /home/bitrix/www/operator/inc/prepare_journal.php on line 18
PK9p�TDB�)[Content_Types].xml �(����N�0E�H�C�mոe�j��%T�Hl�=i-��=}�=N�%ii��%s��=��J���&#��G0� i�y�ƃ���&J�-G:{W�F�t��%����o�F#3`��T���o�?c{]�{"Oˋ~� PK!�U~�_rels/.rels �(����J�@���̽����4�E��D���$����T۷w-�j҃ǝ���|�zs��z�z�*X%(vڛ޵�6O�{PI��� ��`S__�_x �C��CR�ť :����tǖR�����hI�3�H�Q˸*�;��=�y��� n� ����yo������[vrf�A�6�3[�>_��-K���\NH!�<��r���E�B��P���<_�)���@��?�|�h0Gt�v���?i�>��3�4�H8���'��PK9p�T���5�word/_rels/document.xml.rels �(���KO�0��H���w�@y�N/�WW7�9 ��6;����|r��A�/~�䳣���f��u����n����z�L�7��V�����'��a��勭#�V'�ڣ���}��̌MͶ3�}�[�m�{�'���C�\��҅���}���܋�/X��U�B����.O7������������e�}66}�0Wd�^(�ֺ|��am�1&����O��/�jjfr����ύ�k3c�r����y�^��.�ޢ~JG��\�]�P<�.�(��"~Y��}�o���xb�?�5�=|�6>����3���ʜ�C�4�7�)����]����؎����؁�r��-�����^X��v����1���@;^�n����n�#�p�ǃ]�Ķ�)s�_��P�sD�<7?7622W����6Yx�>����݅?g]�Ç�xo
 

Тугай

Новичок
у тябе warning и notice в выдачу лезут отключи или испрвляй свой код, вот это api\agent::CompanyName() should not be called statically
непонятный код это ворд файл пошел
 

Тугай

Новичок
Если авторизация пользователя неважна, то чтоб не воевать с тем что там накодировано раньше, можно вкостылить ридерект через
header("Location: /send_word_file.php?filename=fileName");

и скриптик send_word_file.php в котором только отправляй docx файл, без всего что warning, notice может выдавать,
если это из-за вересии php, то старый код сильно и не вычистишь.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
дебажить код придется самостоятельно
 

bicyclist

Новичок
Location: ... - это ридеркт и браузер запросит этот адрес, на лету это как-то так

header('Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document');
header('Content-Disposition: attachment; filename="file.docx"');
readfile('/path/to/file.docx');
unlink('/path/to/file.docx');
при попытке открыть файл выдаётся предупреждение "к сожалению не удаётся открыть файл из-за проблем с его содержимым.". но после закрытия предупреждения файл открывается нормально. может, как-то по-другому надо хидеры задавать, чтобы не было этого сообщения?
 

Тугай

Новичок
при попытке открыть файл выдаётся предупреждение "к сожалению не удаётся открыть файл из-за проблем с его содержимым.". но после закрытия предупреждения файл открывается нормально. может, как-то по-другому надо хидеры задавать, чтобы не было этого сообщения?
тут https://www.php.net/manual/en/function.readfile.php в примерах посмотри
скорей всего надо раземер еще укзать через Content-Length:
может открываешь, а оно не докачено еще
 

AnrDaemon

Продвинутый новичок
Скорее, скрипт пихает мусор в файл. Надо не гадать, а смотреть глазами.
 
Сверху