2016-03-17 6 views
0

Прежде всего, я нашел similar question, но это не делает трюк, если я его правильно понимаю.пишите csv в ram и файл вывода пользователю [php]

Я создаю csv-файл с PHP со следующими функциями.

// open the file. If not existent yet, create it first 
if (!file_exists($this->filename)) 
{ 
    touch($this->filename); 
} 

$handle = fopen($this->filename, "w+"); 
if ($this->includeHeaders) 
{ 
    $headers = array('Company', 'Contactperson', 'Username', 'Commission', 'WinCAP Version', 'WinCAP Link', 'Contract due', 'POS Version', 'POS Link', 'Quick Select Version', 'Quick Select Link', 'Password'); 
    fputcsv($handle, $headers); 
} 

// mysql-stuff here 

while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) 
{ 
    fputcsv($handle, $row, ";", '"'); 
} 

// done 
fclose($handle); 

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

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

Я прочитал немного о output-buffer, но какой будет файл для $handle? PHP: \\ вне дома?

Просто уточнить: Пользователь нажимает кнопку «export» -> после обработки данных и завершения файла, отобразите SAVE-диалог в браузере. Не сохраняйте файл в FS.

+0

Используйте 'php: // output' как имя вашего файла; просто убедитесь, что вы отправляете правильные заголовки, чтобы сообщить браузеру, что вы отправляете текст/csv, а не text/html в качестве ответа –

ответ

1

Просто отправьте файл для загрузки и удалите его. Добавьте это право после вашего кода:

// Send correct http headers 
header('Content-Description: File Transfer'); 
header("Content-Type: application/csv") ; 
header("Content-Disposition: attachment; filename=ChooseFilename.csv"); 
header("Expires: 0"); 

// Send file to browser 
readfile($this->filename); 

// delete file 
unlink($this->filename); 
+0

, не будет ли он удален сразу после отображения подсказки загрузки? – DasSaffe

+0

Нет, будет отправлен первым. – maxhb

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