2013-08-09 4 views
0

Мне нужно написать и создать непосредственно на странице, файл .html, а затем позволить пользователю загрузить его на свой локальный компьютер. Файл .html будет заполнен информацией os из запросов базы данных. Это будет выглядеть примерно так:Напишите и создайте .html файл скачать

<?php 
    $content = "<!DOCTYPE html><html lang="en"><head></head><body>"; 
    $content .= "<div>Hello World</div>"; 
    $content .= get_all_contents_from_db(); 
    $content .= "</body></html>"; 
?> 

Я видел код, который позволяет загружать страницу, которую вы видите в файл с этим кодом:

<?php 
    if(isset($_POST['download'])) 
    { 
     header("Content-Disposition: attachment; filename=\"" . basename($File) . "\""); 
     header("Content-Type: application/force-download"); 
     header("Content-Length: " . filesize($File)); 
     header("Connection: close"); 
    } 
    ?> 
So the question is: How do I create a downloadable html file using php? 

**PART 2** 
<form method="POST" action=''> 
    <button name="download">Download File</button> 
</form> 
<?php 

    $content = "<!DOCTYPE html><html lang=\"en\"><head></head><body>"; 
    $content .= "<div>Hello World</div>"; 
    $content .= "</body></html>"; 

    if(isset($_POST['download'])){ 

     echo $content; 
     header("Content-Disposition: attachment; filename=\"slideshow.html\""); 
     header("Content-Length: " . filesize($content)); 
     echo $content; 
    } 
?> 

Выходной

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
     <meta charset="utf-8" /> 
    </head> 
    <body> 
    <div class="main">Dashboard</br> 
     <form method="POST" action=''> 
      <button name="download">Download File</button> 
     </form> 
     <!DOCTYPE html><html lang="en"><head></head><body><div>Hello World</div></body></html><!DOCTYPE html><html lang="en"><head></head><body><div>Hello World</div></body></html>   </div> 
    </div> 
    </body> 
</html> 
+1

Вы вопрос отсутствует вопрос. – PeeHaa

+1

Также 'application/force-download' является несуществующим типом контента. – PeeHaa

+0

Контент-тип для HTML-документов - текст/html. – Quentin

ответ

3
header("Content-Disposition: attachment; filename=\"" . basename($File) . "\""); 

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

header("Content-Type: application/force-download"); 

Избавьтесь от этого. Это грязный взлом для людей, которые не знают, что Content-Disposition существует.

header("Content-Length: " . filesize($File)); 

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

Тогда просто эхо ваш $content

+0

Привет, Квентин, спасибо за ваш ответ! Мне удалось загрузить файл с содержимым из $ content, но когда я открываю файл в своем текстовом редакторе, он поставляется с дополнительными тегами и заголовками из файла, в котором он был создан. Как загрузить файл только с текстом, содержащимся в файле var $? Я отредактировал вопрос, чтобы вы могли видеть, что у меня есть. – CIRCLE

+0

Вам нужно * не выводить материал, который вы не хотите *. Скрипт должен предоставить файл HTML для загрузки и ничего другого. Вы не можете вернуть отображаемую страницу и файл для загрузки * одновременно *. – Quentin

+0

Есть ли лучший способ удалить строки кода, которые я не хочу использовать вместо str_replace ('все строки для удаления', '', $ content)? – CIRCLE

-3
<?php 

function output_file($file, $name, $mime_type='') 
{ 
/* 
This function takes a path to a file to output ($file), the filename that the browser will see ($name) and the MIME type of the file ($mime_type, optional). 
*/ 

//Check the file premission 
if(!is_readable($file)) die('File not found or inaccessible!'); 

$size = filesize($file); 
$name = rawurldecode($name); 

/* Figure out the MIME type | Check in array */ 
$known_mime_types=array(
    "pdf" => "application/pdf", 
    "txt" => "text/plain", 
    "html" => "text/html", 
    "htm" => "text/html", 
    "exe" => "application/octet-stream", 
    "zip" => "application/zip", 
    "doc" => "application/msword", 
    "xls" => "application/vnd.ms-excel", 
    "ppt" => "application/vnd.ms-powerpoint", 
    "gif" => "image/gif", 
    "png" => "image/png", 
    "jpeg"=> "image/jpg", 
    "jpg" => "image/jpg", 
    "php" => "text/plain" 
); 

if($mime_type==''){ 
    $file_extension = strtolower(substr(strrchr($file,"."),1)); 
    if(array_key_exists($file_extension, $known_mime_types)){ 
     $mime_type=$known_mime_types[$file_extension]; 
    } else { 
     $mime_type="application/force-download"; 
    }; 
}; 

//turn off output buffering to decrease cpu usage 
@ob_end_clean(); 

// required for IE, otherwise Content-Disposition may be ignored 
if(ini_get('zlib.output_compression')) 
    ini_set('zlib.output_compression', 'Off'); 

header('Content-Type: ' . $mime_type); 
header('Content-Disposition: attachment; filename="'.$name.'"'); 
header("Content-Transfer-Encoding: binary"); 
header('Accept-Ranges: bytes'); 

/* The three lines below basically make the 
    download non-cacheable */ 
header("Cache-control: private"); 
header('Pragma: private'); 
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); 

// multipart-download and download resuming support 
if(isset($_SERVER['HTTP_RANGE'])) 
{ 
    list($a, $range) = explode("=",$_SERVER['HTTP_RANGE'],2); 
    list($range) = explode(",",$range,2); 
    list($range, $range_end) = explode("-", $range); 
    $range=intval($range); 
    if(!$range_end) { 
     $range_end=$size-1; 
    } else { 
     $range_end=intval($range_end); 
    } 

    $new_length = $range_end-$range+1; 
    header("HTTP/1.1 206 Partial Content"); 
    header("Content-Length: $new_length"); 
    header("Content-Range: bytes $range-$range_end/$size"); 
} else { 
    $new_length=$size; 
    header("Content-Length: ".$size); 
} 

/* Will output the file itself */ 
$chunksize = 1*(1024*1024); //you may want to change this 
$bytes_send = 0; 
if ($file = fopen($file, 'r')) 
{ 
    if(isset($_SERVER['HTTP_RANGE'])) 
    fseek($file, $range); 

    while(!feof($file) && 
     (!connection_aborted()) && 
     ($bytes_send<$new_length) 
     ) 
    { 
     $buffer = fread($file, $chunksize); 
     print($buffer); //echo($buffer); // can also possible 
     flush(); 
     $bytes_send += strlen($buffer); 
    } 
fclose($file); 
} else 
//If no permissiion 
die('Error - can not open file.'); 
//die 
die(); 
} 
//Set the time out 
set_time_limit(0); 

//path to the file 
$file_path='files/'.$_REQUEST['filename']; 

//Call the download function with file path,file name and file type 
output_file($file_path, ''.$_REQUEST['filename'].'', 'text/plain'); 
?> 

И ваш файл формы

<a href="download.php?filename=testfile.txt">**DOWNLOAD**</a> 
+0

1) 'application/force-download' не является типом контента, который вы должны использовать. 2) довольно большой код для чего-то простого, как то, что запросит OP. 3) огромная уязвимость, учитывая, что я могу просто запросить любой файл, который я хочу – PeeHaa

+1

4) OP хочет сгенерировать файл «на лету», а не читать его с диска. – Quentin

-1

Первая попытка будет сделать ренные о Является ли ваш файл, который вы хотите генерироваться, что необходимо сделать или нет с помощью кода?

Если генерируется затем перейдите к шагу 2

Else Шаг 1 Добавить функцию сообщения об ошибке в первом ..

  <?php 
     error_reporting(E_ALL^E_NOTICE); 
     $content = "<!DOCTYPE html><html lang="en"><head></head><body>"; 
     $content .= "<div>Hello World</div>"; 
     $content .= get_all_contents_from_db(); 
     $content .= "</body></html>";?> 

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

Шаг 2:

После убедитесь, что ваш файл возник, то для загрузки файла

способа загрузить файл Простого способа: попробовать A HREF тега просто ссылка с тем файлом, который вы хотите загрузить

  <?php 
      <a href="location of sample.html file">Sample File</a> 
      ?> 

Через Coding Путь: (Предположим, что вы хотите, чтобы загрузить файл changepwd то синтаксис должен быть)

 <?php 
     //$file="chngpwd.php"; 
    if($_REQUEST['download']) 
     { 
$file="chngpwd.php"; 
$fs = filesize($file); 
$ft = filetype($file); 

header('Content-Type:application/'.$ft); 
header('Content-Disposition:attachment;filename='.$file); 
header('Content-length'.$fs); 
echo file_get_contents($file); 
     }?> 

     <form method="post" action="" enctype="multipart/form-data"> 
<input type="submit" name="download" value="DOWNLOAD"> 

    </form> 
Смежные вопросы