Как я могу скачать, а затем удалить файл на моем сайте с помощью PHP? - PullRequest
1 голос
/ 10 июля 2011

Я генерирую * .csv файл с PHP, и он прекрасно работает.Проблема в том, что он содержит кучу конфиденциальных данных.Я сделал свои разрешения очень тщательно, поэтому вы не можете получить доступ к ссылке для скачивания или создать файл, не будучи правильным пользователем.Проблема, с которой я сталкиваюсь, заключается в том, что сразу после того, как пользователь загрузит файл, файл должен быть удален сразу же.Вероятность мала, я понимаю, что кто-то будет сидеть там, сканируя структуру моего сайта, но данные достаточно важны для того места, где я хочу прикрыть свою задницу:*

<a href="<?php echo base_path().$ourFileName ?>"><?=$ourFileName?></a>

Это прекрасно работает, просто загружая файл, но мне было трудно выполнять какие-либо действия с ним, потому что если вы вложите PHP-код в OnClick = "", он будет выполнен до щелчкапроисходит, потому что весь код PHP отображается на стороне сервера до обработки HTML и JAVASCRIPT ... верно?Я искал в интернете, и я не мог заставить javascript иметь разрешения на удаление файла ... правда, я мог быть очень неправ.

Поэтому я превратил свою ссылку в форму:

<?PHP
if(isset($_POST['submit']))
{
    header("Location: ".base_path().$ourFileName);
    unlink(base_path().$ourFileName);
}?>

<form action="<? $PHP_SELF ?>" method="post">
<input type="submit" value="Submit" name="submit">
</form>

Но очевидно, что unlink () никогда не будет доступна из-за заголовка ... по крайней мере, я думаю ... Есть ли другой способ, кроме header (), загрузить файл в них?Я понимаю, что могу просто запускать задание cron каждую минуту или что-то в этом роде:

rm -rf *.csv

И это решит проблему, но что произойдет, если пользователь загружает файл и cron?начинает бежать?Или страница сгенерирована, но по какой-то причине они некоторое время не нажимают на ссылку?

Может быть, есть какой-то способ настроить мой файл .htaccess, чтобы вы могли получить доступ к файлу только при ссылке со страницы?

Я слишком усложняю это?

Есть ли у вас какие-нибудь гуру идей в сети?

- edit По популярному предложению я работаю над новым форматом заголовка, поэтомукод выглядит так:

<?PHP if(isset($_POST['submit']) && ($user->uid))
{
    myroom_render_csv($ourFileName, $csv_string);
}?>

<form action="<? $PHP_SELF ?>" method="post">
<input type="submit" value="Submit" name="submit">
</form>

и в отдельном файле:

<?PHP function myroom_render_csv($file_name, $csv_string) {
header('Content-type: text/csv');
$header_string2="Content-Disposition: attachment; filename=\"".$file_name."\"";
header($header_string2);
echo $csv_string;
} ?>

, но я получаю дамп полной HTML-страницы И данные CSV.Идеи?

Ответы [ 2 ]

5 голосов
/ 10 июля 2011

Вот более простое решение - не создавайте файл. Вместо записи ваших данных в файл .csv, просто установите заголовки в php-скрипте так:

header('Content-type: text/csv');
header('Content-Disposition: attachment; filename="whatever.csv"');

echo $csv_data;

Распечатайте ваши csv-данные в php-скрипте, и браузер будет воспринимать их как загрузку файла. Таким образом, вы можете контролировать, кому и когда файл доступен.

1 голос
/ 10 июля 2011

Несколько комментариев.


Это прекрасно работает, просто загружая файл, но мне было трудно делать какие-либо действия с ним, потому что, если вы вложили PHP-код внутрьOnClick = "" он будет выполнен до того, как произойдет щелчок, потому что весь код PHP отображается на стороне сервера до обработки HTML и JAVASCRIPT ... верно?Я искал в интернете, и я не мог получить javascript с разрешением на удаление файла ... по общему признанию, я мог быть очень неправ.

Вы абсолютно правы.


Я создаю * .csv файл с PHP, и он прекрасно работает.Проблема в том, что он содержит кучу конфиденциальных данных.Я сделал свои разрешения очень тщательно, поэтому вы не можете получить доступ к ссылке для скачивания или создать файл, не будучи правильным пользователем.Проблема, с которой я сталкиваюсь, заключается в том, что сразу после того, как пользователь загрузит файл, файл должен быть удален сразу же.Вероятность мала, я понимаю, что кто-то будет сидеть там, просматривая структуру моего сайта, но данные достаточно важны для того места, где я хочу закрыть свою задницу: -)

Тогда почему этофайл?Просто отправьте его в браузер с соответствующими заголовками, чтобы он подсказал браузеру представить его пользователю в качестве сохраняемого файлового ресурса.Это не обязательно должен быть физический файл на веб-сервере.

Другие предоставили код для этого;Я действительно просто хотел отметить, что вы были правы в отношении стороны клиента / сервера.:)


Но очевидно, что функция unlink () никогда не будет доступна из-за заголовка

На самом деле, нет.header не останавливает скрипт.

header("Location: ".base_path().$ourFileName);
unlink(base_path().$ourFileName);

Ваш unlink будет выполнен и завершен задолго до того, как браузер дойдет до даже начиная с запроса на base_path().$ourFileName.

Обычно, хотя, вы должны написать exit, чтобы остановить обработку кода после header:

header("Location: ".base_path().$ourFileName);
exit;
unlink(base_path().$ourFileName);

И теперь, как вы говорите, да, unlink никогда не происходит.

...