示例
1)用户输入<textarea>
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
}
)
);
}
);
答案 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)。