【问题标题】:Error opening a Salesforce File after creating a content version using REST API使用 REST API 创建内容版本后打开 Salesforce 文件时出错
【发布时间】:2018-04-28 16:15:51
【问题描述】:

我正在使用 typescript (angular 4) 发布到 salesforce 端点 https://yourInstance.salesforce.com/services/data/v41.0/sobjects/ContentVersion/ 我的 http 请求如下所示

Request Headers
Content-Type: multipart/form-data; boundary="1524931327799"
Authorization: Bearer <token>


Request Body
--1524931327799
Content-Disposition: form-data; name="entity_document";
Content-Type: application/json; charset=UTF-8

{  
  "PathOnClient" : "IMG_0400.jpg",
  "Title": "IMG_0400.jpg"
}

--1524931327799
Content-Type: image/jpeg
Content-Disposition: form-data; name="VersionData"; filename="IMG_0400.jpg"

/9j/4AAQSkZJRgABAQAAAQABAAD/4QBsRXhpZgAASUkqAAgA <rest of base64 data>

--1524931327799--

在 salesforce 平台上打开图像后,我收到错误消息,指出图像可能已损坏或使用了 Preview 无法识别的文件格式。当我使用文本编辑打开图像时,请求中发送的 base64 数据相同。似乎问题在于 Salesforce 没有识别出文件是图像并且没有解码 base64 数据。欢迎所有和任何帮助!谢谢。

【问题讨论】:

  • 您应该发送未经过 base64 编码的原始二进制数据。
  • 感谢您的回复!不幸的是,我尝试只发送原始二进制文件,但结果相同。

标签: javascript rest http base64 salesforce


【解决方案1】:

我刚刚使用开发人员工作台进行了尝试,这样的请求应该可以正常工作。尽量不要在请求中定义 2 种不同的内容类型,而是将文件的定义放入 ContentVersion 对象的 VersionData 属性中

{  
  "PathOnClient" : "IMG_0400.jpg",
  "Title": "IMG_0400.jpg",
  "VersionData" : "4AAQSkZJRgABAQAAAQABAAD/4QBsRXhpZgAASUkqAAgA"
}

【讨论】:

  • 您是否对 ContentVersion 对象和 VersionData 使用了相同的内容类型?当我使用相同或删除一个时,我收到 400 Bad Request 错误。此外,在对象中添加版本数据后,尝试在 SF 端打开文件后仍然导致相同的错误
【解决方案2】:

我永远无法发布到 /ContentVersion/ 端点。在做了一些研究之后,我发现最简单的解决方案是使用 jsforce https://jsforce.github.io/

使用 jsforce 的解决方案:
1.在你的index.html中导入jsforce库“https://cdnjs.cloudflare.com/ajax/libs/jsforce/1.7.0/jsforce.min.js
2.在你的angular组件顶部导入jsforce

declare var jsforce:any;
  1. 与 jsforce 建立连接

        var conn = new jsforce.Connection({
          loginUrl: "https://test.salesforce.com/",
          clientId : "",
          clientSecret : "",
          redirectUri : ""
        });
        

3. 使用 requestPost 登录到 SF 并发布到复合端点

var username = "";
var password = "";
conn.login(username, password, function(err, userInfo) {
          if (err) { return console.error(err); }
          var path = '/services/data/v41.0';
          return conn.requestPost( path + '/composite/', {
              'allOrNone' : true,
              'compositeRequest' : [
                  {
                      'method' : 'POST',
                      'url' : path + '/sobjects/ContentVersion/',
                      'referenceId' : 'newFile',
                      'body' : {
                          'Title' : fileToPost.name,
                          'PathOnClient' : fileToPost.name,
                          'VersionData' : base64FileData
                      }
                  }
              ]
          })

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    • 2014-05-30
    相关资源
    最近更新 更多