简单的问题。我在我的mojolicious应用程序中生成了一个.doc文件。我想下载它。这是我的问题,如何让浏览器下载它?
我正在使用CPAN模块MsOffice::Word::HTML::Writer来生成文档。
这是我的mojolicious应用程序中的子例程,它由Jquery中的Ajax请求调用:
sub down_doc {
my $self = shift;
my $doc = MsOffice::Word::HTML::Writer->new(
title => "My new Doc",
WordDocument => {View => 'Print'},
);
$doc->write("Content and Stuff");
my $save = $doc->save_as("/docs/file.doc");
$self->res->headers->content_disposition("attachment;filename=file.doc");
$self->res->headers->content_type('application/msword');
$self->render(data => $doc->content);
}
这是我在Jquery中的Ajax请求:
var request = $.ajax({
url: "/down_doc",
type: "post",
data: {'data': data},
});
request.done(function(response, textStatus, jqXHR) {
window.location.href = response;
});
我知道我的Ajax“完成”处理程序是错误的,我只是在尝试。如何使我的网页提示保存并下载.doc文件?
答案 0 :(得分:5)
你在哪里非常接近,但我会推荐以下任何一种选择......
您可以安装插件Mojolicious::Plugin::RenderFile以简化此操作。
示例强>
plugin 'RenderFile';
sub down_doc {
my $self = shift;
my $doc = MsOffice::Word::HTML::Writer->new(
title => "My new Doc",
WordDocument => {View => 'Print'},
);
$doc->write("Content and Stuff");
my $save = $doc->save_as("/docs/file.doc");
$self->render_file('filepath' => "/docs/file.doc");
}
或者,如果您只想使用Mojo
,则以下内容将有效,并在下面的链接中进一步说明。
use Cwd;
app->static->paths->[0] = getcwd;
sub down_doc {
my $self = shift;
my $doc = MsOffice::Word::HTML::Writer->new(
title => "My new Doc",
WordDocument => {View => 'Print'},
);
$doc->write("Content and Stuff");
my $save = $doc->save_as("/docs/file.doc");
shift->render_static("/docs/file.doc");
}
答案 1 :(得分:2)
这在服务器端确实不是问题,而是在不使用(相对较新的)File API的情况下无法保存来自ajax请求的响应。我建议用临时表格替换ajax:
$('<form method="post" action="/down_doc">')
.append(
$('<input type="hidden" name="data">')
.attr("value", JSON.stringify(data))
)
.appendTo('body')
.submit();
提交表单并且/ down_doc处理程序使用相应的content-disposition标头和文档数据进行回复时,浏览器将执行处理文件保存的工作。
如果您在请求后没有计划在服务器上使用该文件,则可以删除此行:
my $save = $doc->save_as("/docs/file.doc");