如何通过CGI触发浏览器保存文件?

时间:2012-06-06 10:24:59

标签: html perl browser user-interface cgi

我有以下隐藏的形式:

<form id='export_svg_container_single_form'
      action='exportSVG.pl'
      method='post'
      target='_blank'
      style='display:none;'>
  <input type='text'
         id='export_svg_container_single_form_data'
         name='export_svg_data'
         style=';' />
</form>

在表单提交之前,export_svg_data字段值将填充SVG文档。

提交时,这将作用于以下简单的CGI脚本,用Perl编写:

#!/usr/bin/perl

use strict;
use warnings;
use CGI;
use CGI::Pretty qw/:standard/;

my $val = param('export_svg_data');
print "Content-Type:image/svg+xml\n";
print "Content-Disposition: inline\n";
print "Content-Description: File to download\n\n";
print $val;

提交后,隐藏表单还会打开一个新选项卡并显示(在本例中)一个SVG文档。然后,最终用户可以将窗口保存到文件中。

相反,在提交表单时,我想要做的是让浏览器自动打开保存另存为对话框,以便用户可以选择filename并保存文档,而不是在浏览器窗口中呈现SVG。

我如何使用JavaScript或对CGI脚本进行适当的更改? (我想保持父表单页面不变,即打开一个新标签或窗口,如果需要的话。)感谢您的建议。

再次澄清,我正在寻找一个解决方案,它会显示保存对话框。我不希望脚本确定文件名并将其保存在任意位置,无需任何用户干预。

2 个答案:

答案 0 :(得分:5)

答案 1 :(得分:-1)

顺便说一下......你能说清楚这是为了什么吗?可以是替代解决方案......

内容 - 处置不会普遍有用,您最终需要的是从虚拟URL提供此文件,比如说

/generated-images/generatedname.svg

然后你在HTML中说

<form ... action="/generated-images/generatedname.svg" ...>

和你的脚本类似于这些Apache指令(在config或.htaccess中),我不保证这可行,但我认为它接近真实(你还需要正确的路径和设置来运行Apache的CGI )

<Directory /.../generated-images/>
    Action mirror-svg-data /path/somescript.cgi
    AddHandler mirror-svg-data .svg
</Directory>

或者你也可以将你的URL重写为脚本,但我不确定内部重定向如何与POST一起使用,你可以试试这个:

RewriteRule /generated-images/.*\.svg /somepath/script.cgi [L]
祝你好运!