我需要从salesforce中提取附件吗?我需要将一些笔记和附件转移到另一个环境中。我能够提取笔记,但不知道如何提取附件
由于
Prady
答案 0 :(得分:3)
这主要取决于您用于提取的工具/实用程序。如果查询中包含Attachment
字段,则Body
sObject的SOQL将始终一次返回一行。这是为了保护资源并防止过度使用SOQL脚本。
方法#1,如果queryMore不可用:发出SOQL
没有Body
字段来枚举所有附件,然后为每个附件ID发出一个SOQL以检索Body
方法#2:发出SOQL以检索所有需要的附件,然后使用queryMore
循环以一次获取一个。
方法#3:如果您可以“冻结”SF环境,并且只想拍摄系统的快照以预先加载要在未来使用的另一个系统,则可以使用“数据导出”。在设置菜单中,在数据管理中有一个导出数据命令,请确保单击“包含在导出中”以包含所有二进制数据。经过适当的处理后,它将为您提供完整的数据备份,您可以离线处理。
顺便说一下,body是base64编码的,你需要解码才能得到实际的二进制文件
答案 1 :(得分:3)
以下是我用来从SalesForce获取附件二进制内容的解决方案。他们的文档中的示例指出以下内容:
curl
https://na1.salesforce.com/services/data/v20.0/sobjects/Document/015D0000000NdJOIA0/body
-H "Authorization: Bearer token"
所以这里有几个不同的元素。登录过程后您应该能够获得的主机(https://na1.salesforce.com),此主机是基于会话的,因此它总是可以更改。第二个元素是URL的其余部分,您将从Attachment对象的“body”字段获取。第三个和最后一个元素是Authorization标头,它由字符串“Bearer”组成,加上在使用SF后端进行身份验证后提供给您的标记。
响应是二进制文件,在base64中是 NOT ,只需将其保存到文件中即可。
以下是我在Objective C中如何做到这一点的一个例子:
// How to get the correct host, since that is configured after the login.
NSURL * host = [[[[SFRestAPI sharedInstance] coordinator] credentials] instanceUrl];
// The field Body contains the partial URL to get the file content
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@", [host absoluteString], {AttachmentObject}.body]];
// Creating the Authorization header. Important to add the "Bearer " before the token
NSString *authHeader = [NSString stringWithFormat:@"Bearer %@",[[[[SFRestAPI sharedInstance] coordinator] credentials] accessToken]];
NSMutableURLRequest * urlRequest = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60.0];
[urlRequest addValue:authHeader forHTTPHeaderField:@"Authorization"];
[urlRequest setHTTPMethod:@"GET"];
urlConnection = [NSURLConnection connectionWithRequest:urlRequest delegate:self];
希望它有所帮助。
答案 2 :(得分:0)
在SalesForce中,附件将针对一个对象,例如帐户对象。
检索附件的步骤(使用Java格式)
获取附加文件的对象的ID。 e.q.帐户对象
String pid = Account__r().getId();
对Salesforce对象“附件”执行查询,以获取步骤1中的ID
*String q = "Select Name, Body, ContentType from Attachment
where ParentId = '" + pid + "'";
QueryResult qr = connection.query(q);
SObject[] sarr = qr.getRecords();*
SObject so = sarr[0];
Typecast Salesforce Generic Object(SObject)to“Attachment”object
*Attachment att = (Attachment)so;*
从附件体中检索字节数组流,并在字节数组上执行所需的操作。
*byte[] bName = att.getBody();
// Do your operation in byte array stream*