0

我正在尝试将 base64 编码的 PDF 文件发布到 Zendesk 文件上传 API 端点,但从 API 返回的文件 URL 显示该文件已损坏。

首先,我从单独的 API 调用中接收作为 base64 编码字符串的 PDF。让我们称之为base64String

如果我这样做,window.open("data:application/pdf;base64," + base64String)我可以在我的浏览器中查看 PDF。

现在我正在尝试按照此处的文档通过 API 上传文件。如示例所示,我可以成功完成 cURL 调用。但是,jQuery AJAX 调用会损坏 PDF 文件。

client.request({
  url: '/api/v2/uploads.json?filename=test.pdf',
  type: 'POST',
  data: atob(base64String),
  contentType: 'application/binary'
}).then(function(data) {
  window.open(data.upload.attachment.content_url);  // corrupt file
}, function(response) {
  console.log("Failed to upload file to Zendesk.");
  console.log(response);
});

就像我说的,这会成功,但是当我访问content_urlPDF 时不会显示。我很确定POST请求中的文件已损坏。

我尝试将文件作为 base64 字符串上传(不使用 解码atob()),但没有其他任何运气。

更新

将 base64 字符串转换为 blob 后,我仍然无法查看 PDF。

var blob = base64ToBlob(base64String);
console.log(blob);  // Blob {size:39574, type: "application/pdf"}

client.request({
  url: '/api/v2/uploads.json?filename=test.pdf',
  type: 'POST',
  data: blob,
  processData: false,
  contentType: 'application/pdf'
}).then(function(data) {
  window.open(data.upload.attachment.content_url);  // corrupt file
}, function(response) {
  console.log("Failed to upload file to Zendesk.");
  console.log(response);
});

function base64ToBlob(byteString) {
  // write the bytes of the string to an ArrayBuffer
  var ab = new ArrayBuffer(byteString.length);
  var ia = new Uint8Array(ab);
  for (var i = 0; i < byteString.length; i++) {
    ia[i] = byteString.charCodeAt(i);
  }

  // write the ArrayBuffer to a blob, and you're done
  var blob = new Blob([ab], {type: 'application/pdf'});
  return blob;
};
4

1 回答 1

0

我了解到 Zendesk 应用程序框架对请求使用 jQuery AJAX 包装器,并且不支持 arraybuffer 类型,因此文件已损坏。应用程序框架团队已解决此问题。

于 2017-02-17T21:13:44.780 回答