使用 PHP 创建文件以供下载而不保存在服务器上
Posted
技术标签:
【中文标题】使用 PHP 创建文件以供下载而不保存在服务器上【英文标题】:Create file for download without saving on server with PHP 【发布时间】:2012-06-10 04:50:42 【问题描述】:假设我的 php 代码是
<?php
// Get form variables using POST method
$MarriagePostMortem=stripslashes($_POST['MarriagePostMortem']);
$AutoSavesToKeep=stripslashes($_POST['AutoSavesToKeep']);
// Open and write file
$myFile="S3S.cfg";
$fh = fopen($myFile, 'w+') or die("can't open file");
fwrite($fh, "The Sims 3 Starter Configuration
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
MarriagePostMortem $MarriagePostMortem
AutoSavesToKeep $AutoSavesToKeep
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-");
fclose($fh);
//echo "file written\n";
?>
我想将文件直接发送给用户以供下载,而不将其保存到服务器。我真的不太擅长 PHP,那么我到底需要添加/更改什么?
【问题讨论】:
【参考方案1】:header ("Content-Type: application/octet-stream");
header ("Content-disposition: attachment; filename=S3S.cfg");
echo $string; //the string that is the file
【讨论】:
我现在收到此处显示的错误消息:pastehtml.com/view/c0zgndz2d.html @Kuuchuu 您不能两次发送标头。查看 Lawrence Cherone 的回答。【参考方案2】:你应该怎么做,你的 html 标签应该是小写的,除非你输出一个值表,否则你的 html 标签应该是小写的,除非你输出一个值表,使用 div 和 css。您也可以发回脚本,因为从表单接收到的变量是特定的,您只需检查正确的值,然后将数据发送回用户。
<?php
if($_SERVER['REQUEST_METHOD']=='POST')
$mpm = (!empty($_POST['mpm']) && ($_POST['mpm']=='true' || $_POST['mpm']=='false'))?$_POST['mpm']:die('Wrong parameter type');
$astk = (!empty($_POST['astk']) && is_numeric($_POST['astk']))?$_POST['astk']:die('Wrong parameter type');
$content = "The Sims 3 Starter Configuration".PHP_EOL;
$content .= "-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-".PHP_EOL;
$content .= "MarriagePostMortem $mpm".PHP_EOL;
$content .= "AutoSavesToKeep $astk".PHP_EOL;
$content .= "-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-".PHP_EOL;
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-disposition: attachment; filename=S3S.cfg');
header('Content-Length: '.strlen($content));
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Expires: 0');
header('Pragma: public');
echo $content;
exit;
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Sims 3 Starter Configuration</title>
</head>
<body>
<h1>Sims 3 Starter Configuration</h1>
<form action="" method="post">
<input type="reset" value="Clear changes">
<br />
<p>marriagepostmortem
<select name="mpm">
<option value="true">enabled</option>
<option value="false" selected="selected">disabled</option>
</select>
Keep marriage lines on family tree entries after death. experimental!</p>
<p>autosavestokeep
<select name="astk">
<option value="1">1</option>
<option value="2" selected="selected">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
</select>
Number of autosaves to keep.</p>
<p><input type="submit" value="Generate"></p>
</form>
<p>Drag the file onto the sims 3 starter to add configurations.</p>
</body>
</html>
【讨论】:
这比Dagon的回答更正确,而且这个回答还包括解决你遇到的重新加载页面的header问题。 教人钓鱼... :-) 我尽量不写剪切和粘贴答案,没有人向他们学习以上是关于使用 PHP 创建文件以供下载而不保存在服务器上的主要内容,如果未能解决你的问题,请参考以下文章
创建文本文件并添加到zip文件并下载spring boot而不保存在本地服务器中
在 ASP.net Core MVC 2.1 中创建文本文件并下载而不保存在服务器上
打开文件,写入文件,将文件保存为 zip 并流式传输给用户以供下载