使用 JS 消费 Rails send_data 响应

2024-03-04

我有一个连接到 Rails API 后端的 VueJS 前端。

在其中一个端点中,我正在使用邪恶_PDF https://github.com/mileszs/wicked_pdf生成 PDF。当我在浏览器中打开 URL 本身时,PDF 可以正常下载并且完全按照预期工作。当我通过 Vue 发送请求时,API 会返回一个看起来很奇怪的字符串,如下所示:

%PDF-1.4
1 0 obj
<<
/Title (��)
/Creator (��wkhtmltopdf 0.12.4)
/Producer (��Qt 4.8.7)
/CreationDate (D:20190222102025+02'00')
>>
endobj
3 0 obj
<<
/Type /ExtGState
/SA true
/SM 0.02
/ca 1.0
/CA 1.0
/AIS false
...

我不太确定这是什么数据类型?我最初认为它可能是一个 BLOB,但我不知道。我遵循概述的逻辑here https://blog.jayway.com/2017/07/13/open-pdf-downloaded-api-javascript/解析来自我的rails api的响应,它确实将PDF下载到chrome。打开此 PDF 时,它是空白的,并且 Chrome 浏览器顶部的文件名是奇怪字符的组合。这让我认为我没有以正确的方式转换响应,并且最终发生了一些编码问题。

这是我的 Rails API 代码:

def pdf
  pdf_html = ActionController::Base.new.render_to_string(
    template: 'api/v1/exporters/pdf',
    layout: 'pdf',
    page_size: 'A4',
    formats: :html,
    encoding: 'utf8',
    margin: {
      top: 20,
      left: 20,
    }
  )
  pdf = WickedPdf.new.pdf_from_string(pdf_html)
  send_data(
    pdf,                                  
    filename: 'download.pdf',                     
    type: 'application/pdf',                      
    disposition: 'attachment'
  )
end

这是上面链接中的 JS 函数。我将 Rails 响应主体(当控制台记录时,第一个代码块中看起来很奇怪的字符集)作为唯一的参数传递:

showFile(blob){
  var newBlob = new Blob([blob], {type: "application/pdf"})

  if (window.navigator && window.navigator.msSaveOrOpenBlob) {
    window.navigator.msSaveOrOpenBlob(newBlob);
    return;
  } 

  const data = window.URL.createObjectURL(newBlob);
  var link = document.createElement('a');
  link.href = data;
  link.download="file.pdf";
  link.click();
  setTimeout(function(){
    window.URL.revokeObjectURL(data);
  , 100}
}

任何人都可以帮助我指出正确的方向,即如何以正确的方式进行配置或如何以不同/更好的方式进行配置?即使确认响应的数据类型也可能对我有帮助。


如果您正在使用axios https://github.com/axios/axios对于API调用,您可以指定客户端将数据下载为blob。

import axios from 'axios';

axios
    .request({
       url: '/api-url-to-download-pdf',
       responseType: 'blob',
    })
    .then(response => response.data)
    .then(blob => {
        const data = URL.createObjectURL(blob );

        // ... do your stuff here ...
    .catch((err) => {
        // handle error
    });

如果您正在使用获取API https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API发出 API 请求,

fetch('/api-url-to-download-pdf', {
    headers: {
        Accept: 'application/pdf',
    },
    responseType: 'arraybuffer'
})
    .then(response => {
        console.log(response);
        if (response.ok) {
            return response.blob();
        }
    })
    .then(blob => {
        const data = URL.createObjectURL(blob);

        // ... do your stuff here ...
    })
    .catch((err) => {
        // handle error
    });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 JS 消费 Rails send_data 响应 的相关文章

  • 在设置后用 Javascript 替换 'var' css 属性

    我有一个元素 其上设置了 var 属性 如下所示 div class divwithbackground div CSS divwithbackground after background image var page header se
  • 无法使用 Jade 模板包含相对路径文件

    当我尝试将文件包含在同一文件夹中时 收到以下错误 the filename option is required to use include with relative paths 有两个文件 索引 jade 项目列表 jade cont
  • 使用 jQuery live() 初始化插件?

    使用 jQuery 在特定类的所有当前和未来元素上自动初始化插件的最佳方法是什么 例如 假设我想要全部
  • Durandal SPA 与打字稿有关的问题

    我使用 TypeScript 1 8 将我的 durandal SPA 应用程序从 VS 2012 更新到 VS 2015 它将生成 JavaScript ECMA5 我解决了所有构建错误 但我无法修复一个名为 return 语句只能在函数
  • 当key未知时如何获取js对象中的属性值

    我有一个对象数组 a 81 25 p 81 25 81 26 p 81 26 我想循环遍历数组并获取值p在每个元素中 for var key in a console log a key outputs 81 25 Object How d
  • 如何使用javascript将视频文件转换为字符串?

    我在 signalR 工作 我想通过将视频文件拆分为不同部分来将视频文件从一个客户端发送到另一个客户端 我已经通过分割图像源数据发送图像并在另一个客户端上接收该图像 document getElementById fileUpload ad
  • 如何设置管理员批准模型的编辑

    我需要一个普通用户可以编辑模型的系统 但编辑实际上只有在管理员批准后才会发生 我发现了一颗宝石 叫做纸迹 https github com airblade paper trail它确实有模型版本控制 但不具体支持我想要做的事情 我想知道其
  • AngularJS 服务并承诺最佳实践

    我有一个 AngularJS 应用程序services 调用 http资源并返回promise我在控制器中解决了这个问题 这是我正在做的事情的示例 app service Blog function http q var deferred
  • 尝试使用 Rails 和 PostgreSQL 生成模型时,命令挂起且没有错误

    使用该命令时 rails generate model Event name string 什么也没发生 我必须按 CTRL c 我使用的版本是 红宝石 2 1 1p76 导轨4 1 0 PostgreSQL 9 3 4 Mac OS X
  • 如何将数据从 JavaScript 发送到 Python

    我正在 jinja2 和 python2 7 上使用 GAE 进行 Web 开发 我可以从Python获取数据 但我无法将数据从 JavaScript 发送到 Python 这是 JavaScript 代码 function toSave
  • 思考狮身人面像和控制台

    我在 webfaction 上思考 sphinx 时遇到问题 当我在 osx 上本地执行时没有问题 I search gt gt ThinkingSphinx 搜索 雷蒙德 我的回应是这样的 gt 有任何想法吗 thx sg 如果你还没有
  • 从本地 html/javascript 网站插入 mySQL 数据库

    我正在尝试做什么 我的程序的目的是插入数据local HTML JS网站变成online 非本地 mySQL数据库 到目前为止我尝试过的 我试图用来实现此目的的原始方法是让我的本地网站使用 javascript 通过在线发布数据PHP文件
  • 如何使用 javascript 将我的域名字母大写?

    假设我的域名是www hello com 如何使用 jQuery JavaScript 使浏览器的 URL 栏看起来像 www HELLO com 您无法更改浏览器地址栏中显示的内容 这是一项基本的安全功能 您可以使您的域名全部大写 并将页
  • es6-module 默认导出导入为未定义

    我不确定我在这里缺少什么 我正在使用 jspm 和 es6 module loader 开发一个项目 我有一个模块定义如下 import hooks from hooks import api from api import tools f
  • Python 中的 Firebase 身份验证时出现 KeyError:“databaseURL”

    相信你做得很好 我是 firebase 的新手 正在尝试进行用户身份验证 我已经安装了pyrebase4并在firebase控制台上创建了一个项目 我还启用了使用 电子邮件和密码 登录并尝试连接我的应用程序 下面是我正在尝试的代码 impo
  • 反转比例函数

    这对我来说很有趣 看下面的D3代码 var scale d3 scale linear domain 100 500 range 10 350 scale 100 Returns 10 scale 300 Returns 180 scale
  • 阻止 PM2 上不同时运行的请求

    在我的 Express 应用程序中 我在应用程序中定义了 2 个端点 一种用于 is sever up 检查 另一种用于模拟阻塞操作 app use status req res gt res sendStatus 200 app use
  • JS - 如何将图像对象变成灰度并显示它

    基本上 当单击按钮时 它会告诉移动设备转到相机 一旦相机拍照 它就会给我图像数据 它被称为数据 URL 吗 这是我处理它的代码 var imagesrc data image jpeg base64 imageData var myimag
  • 使用 CSP 防止自动点击链接 XSS 攻击

    当将 CSP 用于稍微不同的目的 沙箱 时 我意识到一个非常简单的自动点击链接似乎甚至可以绕过相对严格的 CSP 我所描述的内容如下 内容安全政策 default src none script src unsafe inline 还有身体
  • RubyMine 不能使用 Guard 吗?

    由于某些无法解释的原因 RubyMine 会自动保存您所做的每一个更改 因此每次击键都会触发 Guard 运行您的测试 最可笑的是 显然没有办法禁用这个自动保存 功能 我只是想知道 RubyMine 似乎是 Rails 开发人员中非常流行的

随机推荐

  • 为什么 AVPlayer 在同一个会话中询问多个联合范围?

    我想知道为什么 AVPlayer 会问 请求中的联合范围 例子 1 我们有良好的无线网络连接 2 轨道总长度 1000000 AVPlayer 首先会询问bytes 0 1 没关系 它只是 ping 轨道的可用性 但之后它会问bytes 0
  • 相当于已弃用的 ifNotGranted 属性

    如果用户没有特定角色 我想阻止图像具有链接 例如
  • 有没有办法将变量从 ReactJS 传递到 CSS 样式表?

    我正在编写一个带有可变数量组件的滚动行情 所以我需要它来改变多远translate3d根据组件的数量移动它 我能想到的唯一方法就是以某种方式向它传递一个数字JSX文件 但我找不到办法做到这一点 有什么办法可以通过CSS一个变量 或者其他一些
  • WPF 清除 UserControl 的子级

    我正在 WPF 中创建一个 UserControl 并且 UserControl 的工作原理是当用户将鼠标移动到该控件上时 它的子控件应该被删除 但我似乎没有找到 Children 属性或类似的东西 XAML 在这里
  • Flutter 应用程序运行无法在 null 对象上调用方法 toInteger()

    我是颤振新手 我刚刚在 GitHub 上克隆了一个我必须处理的项目 因此 首先在我的 android studio 中运行该项目会给我带来以下错误 失败 构建失败并出现异常 在哪里 构建文件 C Users 19ngu AndroidStu
  • Mac OS X 支持 WPF 吗?

    我制作了一个 WPF 应用程序 我想知道 Mac OS X 是否支持它 Silverlight WPF 应用程序可以在 Mac 上运行 但否则您需要使用 Parallels 或其他虚拟机来运行 Windows 副本 我怀疑 Mono 已经发
  • 使用 Graphs.jl 在 Julia 中创建简单的图形对象

    我开始研究图论 我计划将其用于机器学习和 或贝叶斯推理 我想在 Julia 中编码 并找到了包Graphs http julia readthedocs org en latest packages packagelist graphs g
  • 如何在 sqlalchemy 中提交之前应用列默认值

    我有一个声明性基础模型 class User Base id Column Integer primary key True money Column Integer default 100 然后我跑 gt gt gt u User gt
  • 在java中创建线程在后台运行

    我想从我的主 java 程序中生成一个 Java 线程 并且该线程应该单独执行 而不会干扰主程序 应该是这样的 用户启动的主程序 做一些业务工作 应该创建一个可以处理后台进程的新线程 一旦创建了线程 主程序就不应该等到生成的线程完成 其实应
  • 在批处理文件中查找/替换文本时如何处理&符号?

    我有以下批处理文件来查找并删除文本文件中的字符串 文本文件将采用以下格式 079754 Billing Business Adv E MyDirectory 079754 35931 Billing Business Adv pdf Com
  • 如何实现虚拟静态属性?

    据我所知C 不支持虚拟静态属性 如何实现这样的行为C 我想实现基类的所有派生类都必须重写静态属性 获取派生类型 我想访问一个名为的静态属性Identifier Type t typeof DerivedClass var identifie
  • OpenGL 上下文丢失后如何重新加载 libgdx 非托管纹理

    我正在通过网络下载图像 并使用以下命令将它们作为图像演员添加到我的 libgdx UI 中 Pixmap pm new Pixmap data 0 data length Texture t new Texture pm TextureRe
  • FirebaseRecyclerPagingAdapter - 按日期排序列表

    在我的应用程序中 我想显示保存在实时数据库中的新闻列表 每个新闻项目都有一个以毫秒为单位的时间戳 以指示新闻的日期 我想首先使用 FirebaseRecyclerPagingAdapter 在 RecyclerView 上显示最新新闻 这个
  • 合并两个图并在 R igraph 中添加边权重

    我试图将两个图与相同的节点组合起来 但这样新的图边权重是两个原始图的总和 但当然希望解决方案扩展到 N 个图 g1 lt graph empty directed FALSE vertices letters 1 2 g1 lt g1 ed
  • 在 asp.net mvc 中单击按钮动态添加控件

    我正在创建一个 asp net MVC 应用程序 我想在其中提供动态添加控件的功能 我有一个表单 其中有两个用于名字和姓氏的文本框 它们用作单个控件 现在用户可以添加任意数量的这组控件 我可以使用 java 脚本在页面上添加这些控件 但我不
  • flutter :不支持的操作:无法添加到不可修改的列表

    我在 StatelessWidget 中有一个 ListView 它有项目 每个项目都包含一个复选框 当有人检查某个项目时 我希望 ListView 将其作为参数发送到另一个页面 但是当我这样做时 它给了我这个错误 I flutter 70
  • WebLogic“超出规定的内容长度”错误

    我有一个 Servlet 过滤器 它在 WebLogic 10 0 中生成 超出规定的内容长度 错误 如果有任何解决此问题的建议 我将不胜感激 详情如下 servlet 过滤器调整图像大小 将 FileInputStream 的内容 从磁盘
  • 如何使用 JGit 检查 Git 克隆是否已完成

    我学习 git 并使用 JGit 从 java 代码访问 Git 存储库 Git 默认情况下不允许克隆到非空目录 我们如何确定本地计算机中的特定 git 存储库已经完成了 git 克隆 以便我们随后只能执行 Git pull 操作 目前我正
  • JavaScript 中的 child 和 childNode 有什么区别?

    我发现自己使用 JavaScript 并且遇到了childNodes and children特性 我想知道它们之间有什么区别 还有一个比另一个更受青睐吗 Understand that children https dom spec wh
  • 使用 JS 消费 Rails send_data 响应

    我有一个连接到 Rails API 后端的 VueJS 前端 在其中一个端点中 我正在使用邪恶 PDF https github com mileszs wicked pdf生成 PDF 当我在浏览器中打开 URL 本身时 PDF 可以正常