FileReader 读取 PDF 时丢失数据

2024-05-26

我的限制是只能以 JSON 格式将数据发送到服务器,并且我需要将 PDF 文件与 JSON 中的其他表单数据一起发送。我虽然可以用 base64 从中创建一个字符串,如下所示这个解决方案 https://stackoverflow.com/a/37699333/2197181我在SO上发现:

let data = {foo: 1, bar: 2};
let reader = new FileReader();
reader.readAsDataURL(pdf);
reader.onload = () => {
  data.file = reader.result;
  $.ajax({type: 'POST', dataType: "json", data: JSON.stringify(data), ...});
}

但事情却发生了reader.result不包含整个 PDF(无论我将其保存到文件而不是发送,还是从服务器取回)。在文本编辑器中,内容是相同的,但二进制编辑器表示缺少一些字节。我的浏览器可以将其加载为 pdf 并显示标题,但页面是空白的。

我也尝试过reader.readAsBinaryString并自己转换为base64btoa,但结果相同。

Edit:CodePen示例:https://codepen.io/jdelafon/pen/eRWLdz?editors=1011 https://codepen.io/jdelafon/pen/eRWLdz?editors=1011

Edit: 为了验证,我这样做了:

let reader = new FileReader();
reader.readAsBinaryString(pdf);
reader.onload = () => {
    let blob = reader.result;
    let file = new Blob([blob], {type: 'application/pdf'});
    let fileURL = window.URL.createObjectURL(file);
    // make it display in <embed>
};

pdf 的正文是空的。如果我更换file由原来的pdf,它会完全显示。所以FileReader在这个过程中丢失了数据。

有没有更好的办法?是否是编码问题FileReader?

我也想过像这样使用 FormData:

let data = {foo: 1, bar: 2};
let fd = new FormData();
fd.append('file', pdf);
data.file = btoa(fd);
$.ajax({type: 'POST', dataType: "json", data: JSON.stringify(data), ...});

但是现在当我从服务器取回数据时,JS 不知道它代表一个 FormData 对象,所以我不知道如何取回文件以在浏览器中显示。是否可以?


当你尝试的时候,你离成功就不远了btoa,除非你不能“btoa-ize”一个 FormData。

reader.readAsBinaryString(pdf); // don’t use this! See edit below
reader.onload = () => {
  let b64payload = btoa(reader.result);
  $.ajax({
    type: 'POST',
    dataType: "json",
    data: JSON.stringify({ "file": b64payload }),
  });
}

我不知道为什么readAsDataURL但解决方案失败了。


Edit:尽管不确定,但有人怀疑已弃用的readAsBinaryString方法可能是问题的根源。以下解决方案基于readAsDataURL, 工作中:

reader.readAsDataURL(pdf);
reader.onload = () => {
  $.ajax({
    type: 'POST',
    dataType: "json",
    data: JSON.stringify({ "dataURL": reader.result }),
  });
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FileReader 读取 PDF 时丢失数据 的相关文章

随机推荐

  • 如何从代码后面的 Blazor WebAssembly 项目打开浏览器窗口/选项卡:

    我正在将 UWP 应用程序转换为托管 ASP NET Core 的 Blazor WebAssembly 我的标记代码位于 Index razor 中 后面的代码位于 Index razor cs 中 在 UWP 项目中 我通过 oncli
  • 如何使用服务器端vbscript获取图像宽度? ASP经典

    几天来我一直在尝试找到一种方法来获取驻留在我们服务器上的 png 文件的图像宽度 我正在尝试读取文件的前 24 个字节并解析出字节 17 20 的宽度 我在网上找到了几种例程 但都没有成功 奇怪的是 我似乎得到了从十六进制解码到十进制的字节
  • C++:函数左值或右值

    我刚刚开始通过阅读来了解 c 11 中的右值引用这一页 http thbecker net articles rvalue references section 01 html 但我卡在了第一页 这是我从该页面获取的代码 int foo f
  • 熊猫直方图 df.hist() 分组依据

    如何使用 group by 用 pandas DataFrame hist 绘制直方图 我有一个包含 5 列的数据框 A B C D 和 Group 有两个组类别 是 和 否 Using df hist 我获取了 4 列中每一列的历史记录
  • 如何部署经典的asp网站?

    我想知道如何部署或在 IIS 6 7 中部署经典的 asp 网站涉及哪些步骤 我们可以为现有项目创建一个安装程序吗 您应该考虑使用 Web 部署http www iis net download WebDeploy http www iis
  • 如何使用 python apply/lambda/shift 函数根据 2 列的值获取该特定列的前一行值?

    我有 2 列 FN1 和 FN2 基于这些我必须再创建一列 最终 FN1 FN2 Final False False 1 True True 1 False False 1 True False 2 True True 2 False Fa
  • 通过 preg_match_all PHP 函数从 html 代码字符串中提取 img 标签

    我有一些 html 代码并提取了img src来自它的属性 html 字符串中有一些像这样的 img img src http www pecso it wp content uploads 2016 12 10 WRAS png 我尝试使
  • 仅部分页面滚动的 html 布局

    我想创建一个分为 3 部分的页面布局 一列具有固定宽度 其中包含两行具有固定高度 另一个具有固定宽度的列 可能包含多个项目 超出视图范围 我正在寻找一种方法 使页面滚动仅影响项目列 以便屏幕的左侧 第一列 保持在视图中 下面是布局的示例图像
  • SagePay 直接集成套件 v4.00 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有适用于 4 00 版本的 Dot Net SagePay 直接集成套件 我试图在 SagePay
  • boost.asio 链接和库

    我是 boost asio 编程的新手 并且在链接 boost 库时遇到困难 我的问题是 当我包含 asio 标头时 如何找出应该链接到我的项目的库 例如我用过 include
  • Paypal PDT交易ID有效期

    当我尝试使用交易 ID 检索付款信息时 我从 paypal PDT 收到错误 4003 虽然我这里有一个类似的线程 贝宝 PDT 错误 4003 https stackoverflow com questions 8521800 paypa
  • bootstrap navbar-static-top 菜单分成两行

    我遇到了引导导航栏的问题 我使用 navbar static top 制作了菜单 起初一切都很好 当菜单被展开并添加了一些项目时 现在随着折叠之前的宽度 它扩展到两行 看起来很糟糕 在 CSS bootstrap 中进行了更深入的挖掘 但没
  • 查明 AD 中的组是否属于通讯组?

    我正在使用 ASP net 和 C 并且对 Active Directory 知之甚少 我接到一项任务 按以下步骤编写程序 ASP net 应用程序被赋予用户的用户名 应用程序应查询具有给定用户名的用户的所有组 然后 应用程序应将这些组显示
  • 使用资源进行主题化,无需 Blend 呕吐

    WPF 的伟大之处在于 我应该能够在整个应用程序中使用 StaticResource MyBackground 而不是 White 然后通过更改资源定义重新定义整个应用程序的外观 问题是如果您在子控件中引用了全局资源 Expression
  • GNU Global 和 GTAGS 找不到类定义

    我在全局查找类 结构定义时遇到问题 我可以使用丰富的 ctags 和 cscope 找到它们 所有标记文件都是从相同的源文件列表构建的 我配置并构建了全局等 仅指定了 prefix configure 确实发现了 exhuberant 并且
  • Anythingslider 触摸滑动功能可阻止 IOS 和平板设备上链接的正常点击

    我正在将任何滑块 jquery 插件与触摸事件一起使用 它似乎在所有设备上都能按预期工作 允许用户通过触摸平板电脑和 iOS 设备以及在桌面上使用鼠标来 滑动 slider anythingSlider Callback when the
  • 使用 volatile 关键字时出现内存一致性错误的示例?

    来自文档 使用易失性变量可以降低内存一致性错误的风险 但这是否意味着有时易失性变量无法正常工作 奇怪的是它的使用方式 在我看来 这是非常糟糕的代码 有时工作有时不工作 我尝试谷歌 但没有找到易失性内存一致性错误的示例 您能推荐一个吗 问题不
  • WordPress > 通过脚本错误设置永久链接选项?

    我的主题的自定义选项面板具有以下代码 初始化站点选项 if get option permalink struct update option permalink struct postname 这会检查永久链接选项设置 并且由于 WP 默
  • 如何在 Xcode 8 中更改应用程序显示名称以添加空格

    我试图在 Xcode 8 中的应用程序名称 独立贴纸包 中添加一个空格 我在这里看到的解决方案是更改产品名称 在包装中 或更改 捆绑显示名称 我更改了产品名称 但没有起作用 我清理 重建 重置模拟器中的内容和设置 并注销 xcode 重新登
  • FileReader 读取 PDF 时丢失数据

    我的限制是只能以 JSON 格式将数据发送到服务器 并且我需要将 PDF 文件与 JSON 中的其他表单数据一起发送 我虽然可以用 base64 从中创建一个字符串 如下所示这个解决方案 https stackoverflow com a