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

时间:2011-02-17 01:19:13

标签: 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
    }
   )
  );
 }
);

3 个答案:

答案 0 :(得分:2)

如何在父DOM上创建表单,并将其发布到您创建的IFRAME /弹出窗口中?

POST操作网址将是您的generateMu3.php

回答你的问题,

A&amp; B)我假设...只要generateM3u.php为.m3u文件设置正确的MIMEType ...

我不熟悉PHP中的语法,但是在Java和Java中都是如此。 .NET,您可以在标题中将响应的MIMEType设置为Word文档,浏览器将读取标题,如果它是“可保存”的文件,它将提示客户端保存页面作为文件。

答案 1 :(得分:2)

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

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

$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文件类型匹配。

答案 2 :(得分:0)

如果我正确读到这个,就会有一台机器创建.m3u文件。在这种情况下,可能只是将文件写入临时目录,在unix机器上/tmp和在Windows机器上C:\Windows\Temp。这些文件在启动时被清除,这应该允许您处理 B)而不需要所有 A)