2012-07-03 2 views
10

У меня есть сайт php/mysql, в котором я пытаюсь загрузить файл с разделителями-запятыми (CSV). Создаваемый файл csv содержит данные с разделителями-запятыми (имя, адрес, город, штат). Я создаю файл csv ok и поместил его в каталог сайта/downloads. Все идет нормально. Я смотрел на линию и код для запуска загрузки строки браузера, что я вижу, наиболее часто:с помощью браузера открыть для загрузки файл

$path = $_SERVER['DOCUMENT_ROOT']; 
$exportfile = "emailclientaddresses.csv"; 
$fullpath = "downloads/" . $exportfile; 
header("Content-type: text/plain"); 
header("Content-Length: ".filesize($exportfile)); 
header("Content-Disposition: attachment; filename=" . $fullpath); 

в $ Exportfile является CSV-файл, который создал мой код. Все нормально. Что это делает:

  1. в $ FULLPATH отображается в браузере загрузки строки в очень странном формате: download_emailclientaddresses.csv
  2. Когда это скачать текущей страницы загрузки или сочетание файла CSV и текущей веб-страницы.

Хорошо, я пробовал много вещей, и ничего не сработало. Поэтому, если кто-нибудь может мне помочь, я был бы признателен. Спасибо.

ред Cohen

+1

Почему вы не за исключением ответа на @Anne как правильный ответ, так как это? – Llewellyn

ответ

31

PHP documentation обеспечивает хороший пример:

<?php 
$file = 'monkey.gif'; 

if (file_exists($file)) { 
    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename='.basename($file)); 
    header('Content-Transfer-Encoding: binary'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate'); 
    header('Pragma: public'); 
    header('Content-Length: ' . filesize($file)); 
    ob_clean(); 
    flush(); 
    readfile($file); 
    exit; 
} 
?> 

EDIT(Ответ на комментарий, объяснение)

header('Content-Description: File Transfer'); 

Не отображать в браузере, но передайте файл.

header('Content-Type: application/octet-stream'); 
header('Content-Transfer-Encoding: binary'); 

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

header('Content-Disposition: attachment; filename='.basename($file)); 

Диалоговое окно загрузки показывает правильное имя файла.
Примечание: вы можете использовать любое имя файла.

header('Expires: 0'); 
header('Cache-Control: must-revalidate'); 
header('Pragma: public'); 

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

header('Content-Length: ' . filesize($file)); 

Отправить правильный размер файла в браузер,
в противном случае браузер не может оценить передаточное время.

ob_clean(); 
flush(); 

Перед загрузкой убедитесь, что заголовки отправлены в браузер.

readfile($file); 

Отправьте этот файл на компьютер.

exit; 

Готово :)

+0

Спасибо!Это работало как шарм !!! Каковы все эти дополнительные линии? Еще раз спасибо. –

+0

Обновления ответы :) – Anne

+0

Спасибо, Энн еще раз. Это действительно помогает. Он также показывает, что ответ «был в книге». Так сказать. Хм, может, мне нужно это прочитать раз в то время? –