php - 服务器即时创建文件供客户端保存

标签 php javascript html ajax file-io

示例

1) 用户在 <textarea> 中进入播放列表

  • C:/music/foo.mp3
  • C:/music/bar.mp3
  • C:/music/hello.mp3

2) 他们点击保存按钮。我使用 AJAX 将用户的播放列表发送到服务器。

3) 服务器以这种方式用 PHP 格式化文本:

<playlist>
 <item>C:/music/foo.mp3</item>
 <item>C:/music/bar.mp3</item>
 <item>C:/music/hello.mp3</item>
</playlist>

4) 会弹出一个文件保存对话框,要求用户将此格式化文本作为 playlist.m3u 保存在他们自己的硬盘上。


问题

A) 生成这个m3u文件时,是否可以不将文件写入服务器上的硬盘?我不想让数百万个文件阻塞我的服务器。我想 PHP 可以回显格式化文本并将标题设置为伪装成文件。

B) 如何为这个即时 文件弹出文件保存对话框?如果它是一个真实的文件,我会让 PHP 返回文件的位置。然后我会让 JS 在该位置插入一个新的 iFrame。但是我不想在服务器上写文件,所以我不能这样做。

new Ajax.Request(
 'generateM3u.php',
 onSuccess: function(transport) {
  $$('body').first().appendChild(
   new Element(
    'iframe', {
     src: transport.responseText
    }
   )
  );
 }
);

最佳答案

你应该看看http://php.net/manual/en/function.header.php来自 PHP 手册。页面底部有很多关于强制浏览器显示下载提示而不是打印到屏幕的用户贡献。

这是该页面 ( By phpnet at holodyn dot com 31-Jan-2011 09:01 ) 中的一个,我对其进行了轻微编辑。我认为它回答了问题 A 和 B。只需通过 iframe 将文本框的内容发送到 PHP 文件,让它适本地格式化文本并使用以下 header 将其发送回浏览器。

$contents = '<playlist>etc....</playlist>';

header("Pragma: public"); // required
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private", false); // required for certain browsers
header("Content-Type: audio/x-mpegurl");
header("Content-Disposition: attachment; filename=\"playlist.m3u\";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . strlen($contents));
ob_clean();
flush();
echo $contents;

编辑:如果您想要的是一个全 Javascript 解决方案,那么我个人并不知道,而且在谷歌搜索之后,看起来其他人也不知道。大多数人似乎使用指向服务器端文件的不可见 iframe 来解决此问题。

编辑 2:我更改了内容类型,使其与 m3u 文件类型匹配。

关于php - 服务器即时创建文件供客户端保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5024117/

相关文章:

javascript - 切换页面上的所有 jQuery 选项卡

php - CodeIgniter form_validation 不显示错误

javascript - Vuejs nuxt 仅在浏览器中导入

php - 从 PHP mySQL 返回 Json 数组 - 错误

javascript - Angular 。删除根标签上的属性

javascript - SweetAlert 文本格式

html - 如何在不关闭 HTML 编码的情况下在 asp GridView BoundField 中正确显示换行符

angularjs - 如何根据用户位置(而不是 html5 地理定位)将谷歌地图居中? ( Angular JS)

javascript - 在 jquery.dataTable 中同时输入两个字段

PHP/HTML/CSS 表格滚动