jspdf - 使用 png 直接上传到 s3 的 pdf,png 已损坏

Posted

技术标签:

【中文标题】jspdf - 使用 png 直接上传到 s3 的 pdf,png 已损坏【英文标题】:jspdf - pdf uploaded directly to s3 with png, png is corrupt 【发布时间】:2018-07-12 01:59:39 【问题描述】:

我正在使用 jspdf 库和 Angular 5 在客户端生成 PDF。我正在向 pdf 添加一个 png 图像。

我已经使用 dataurl.net 生成了我的 .png 文件。当我将它添加到 pdf 并使用 doc.save() 时,它会在本地下载,并且看起来很棒并且运行良好。但是,我尝试将其直接上传到 s3,改用 doc.output(),当它到达那里时,它看起来像这样:https://imgur.com/a/ZuOd0

我要放入 s3 的代码如下所示:

const headers = new HttpHeaders().set('Content-Type', 'application/pdf')
this.http.put(url, file, headers)

file = doc.output()

有人知道是什么原因造成的吗?

【问题讨论】:

我实际上注意到在本地保存 doc.output() 的结果有同样的问题,所以我怀疑这是 jspdf 库或我调用 doc.output( ),与 angular/s3 或上传过程无关 看起来字符编码或流数据有一些差异,您可以在此处查看差异:quickdiff.net/?unique_id=9084579D-3251-D1F4-F253-FF170459FA69 jsfiddle 的问题:jsfiddle.net/96qcc4bd 看起来数据是一样的,但是因为它之间有二进制流。将其转换为字符串会在这里产生问题。你最好的办法是在这里使用base64数据,然后发送到aws 我也尝试过发送 base64 版本,但亚马逊似乎对此没有做任何事情,因此它保持 base64 编码并导致“损坏的 pdf 文件” 【参考方案1】:

我必须将 ArrayBuffer 传递给 s3 才能使其工作。

所以唯一的代码更改是使用doc.output('arraybuffer')

【讨论】:

【参考方案2】:

您需要将 ArrayBuffer 传递给 s3 才能使其工作。

只需要改变 doc.output('arraybuffer')

【讨论】:

以上是关于jspdf - 使用 png 直接上传到 s3 的 pdf,png 已损坏的主要内容,如果未能解决你的问题,请参考以下文章

AWS - CORS 无法将文件直接上传到 S3

使用签名的 url 将文件从 angularjs 直接上传到 amazon s3

如何将查询结果从雪花直接上传到 S3?

不使用生产服务器直接上传到 s3

不带 CORS 直接上传到 S3(非浏览器)

Rails + CarrierwaveDirect:成功直接上传到S3后无法下载和处理图像