为了分离关注点,我们在服务器端开发了Rails Api,在客户端开发了Backbone/Marionette。今天,我们尝试通过一个专用的路径将新生成的发票发送给我们的用户。其背后的想法如下:用户单击发票,向服务器发出请求,服务器发送文件,客户端显示/允许下载该文件。
在服务器端,invoice方法如下所示:
def invoice
@order = current_user.orders.with_uuid(params[:id])
if @order
@order.order_attachment.with_document_file do |file|
File.open(file.path, 'r') do |f|
send_data f.read, :filename => 'report.pdf',
:type => 'application/pdf',
:disposition => 'attachment'
end
end
else
render nothing: true, status: :not_found
end
end
在客户端,我们使用此函数获取数据以测试代码:
$.get("#{config.apiRootUrl}user/things/#{@model.attributes.id}/invoice", dataType: 'binary', processData: false)
.complete (response) ->
console.log response
.fail (response) ->
console.log response
响应如下所示(原始数据提取,因为它要长得多):
%PDF-1.4
%ÿÿÿÿ
1 0 obj
<< /Creator <feff0050007200610077006e>
/Producer <feff0050007200610077006e>
>>
endobj
2 0 obj
<< /Type /Catalog
/Pages 3 0 R
>>
endobj
3 0 obj
<< /Type /Pages
/Count 1
/Kids [5 0 R]
>>
endobj
4 0 obj
<< /Length 8033
>>
stream
q
q
128.000 0 0 57.000 36.000 699.000 cm
/I1 Do
Q
1 w
/DeviceRGB CS
1.000 1.000 1.000 SCN
36.000 649.000 m
191.856 649.000 l
S
[ ] 0 d
因此,这里来的问题。记住,我们不能使用不同的方法下载.pdf文件,如给客户端一个网址直接下载.pdf文件,并考虑到以前的数据,有没有一种方法:
- 在服务器端更好地指定内容,以便浏览器了解它是一个pdf文件而不是原始数据?
- 使用客户端花哨的库,从原始数据重建pdf一旦收到客户端?
- 解决此问题的任何其他解决方案。
感谢您抽出时间和帮助。
2条答案
按热度按时间ryhaxcpt1#
[Not tested!]在控制器中,我会将渲染部分 Package 在一个块中
以及在客户端请求invoice.pdf而不指定dataType时
icnyk63a2#
对于那些想知道如何处理来自rest api的包含.pdf的响应的人来说,答案是在客户端。我们必须基于api响应创建blob对象,以便在客户端“重建”pdf。下面是我们用于实现此目的的示例: