为了分离问题,我们制作了这个应用程序,例如服务器端的Rails Api和客户端的Backbone / Marionette。今天,我们正努力通过专用路线向用户发送新生成的发票。其背后的想法如下:用户点击发票,向服务器发出请求,服务器发送文件,客户端显示/允许下载。
在服务器端,发票方法如下所示:
$.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
响应看起来像(原始数据提取,因为它的方式更长):
\r\n\r\n' has type str, but isn't valid UTF-8 encoding. Non-UTF-8 strings must be converted to unicode objects before being added.
所以,问题来了。请记住,我们不能使用不同的方法进行.pdf下载,例如给客户端提供直接下载.pdf文件的URL并考虑以前的数据,有没有办法:
感谢您的时间和帮助。
答案 0 :(得分:0)
[未经测试!] 在控制器中,我将渲染部分包装在一个块
中 respond_to do |format|
format.pdf {
...<your code>...
}
end
并在客户端请求invoice.pdf而未指定dataType
答案 1 :(得分:0)
对于那些正在寻找如何处理来自rest api的包含.pdf的响应的人来说,答案是在客户端。我们必须根据api响应创建该blob对象,以便在客户端“重新构建”pdf。以下是我们用于实现此目的的示例:
$.get("#{config.apiRootUrl}user/orders/#{@model.attributes.uuid}/invoice")
.complete (response) ->
blob = new Blob([response.responseText], type: 'application/pdf')
url = URL.createObjectURL(blob)
$a = $('<a />', {
'href': url,
'download': "#{Date.now()}.pdf",
'text': "click"
}).hide().appendTo("body")[0].click()