ローカル マシンでセールスフォース ドキュメントを取得するために、セールスフォース API を使用しています。ドキュメントは base64 でエンコードされています。Object 型として返されます。デコードしてローカル マシンに保存しようとすると、「java.lang.ArrayIndexOutOfBoundsException: -84」エラーが発生します。配列の存在しないインデックスにアクセスしようとすると発生することはわかっていますが、ここでは行っていません。コモンズ ライブラリを使用しています。
あなたの誰かが私を助けたり、ファイルをデコードして私のローカルマシンに保存するためのより良い方法を提案してくれませんか.
import org.apache.commons.codec.binary.Base64; //and other imports
private void querySample() {
try {
// Set query batch size
partnerConnection.setQueryOptions(250);
// SOQL query to use
String soqlQuery = "SELECT Name, Body, BodyLength FROM Document LIMIT 1";
// Make the query call and get the query results
QueryResult qr = partnerConnection.query(soqlQuery);
boolean done = false;
SObject document;
Object docName;
Object docBody;
Object bodyLength;
byte[] encoded;
byte[] decoded;
int loopCount = 0;
// Loop through the batches of returned results
while (!done) {
System.out.println("Records in results set " + loopCount++
+ " - ");
SObject[] records = qr.getRecords();
// Process the query results
for (int i = 0; i < records.length; i++) {
document = records[i];
docName = document.getField("Name");
docBody = document.getField("Body"); //Body is base 64
bodyLength = document.getField("BodyLength");
encoded = serialize(docBody);
Integer size = Integer.parseInt((String) bodyLength);
decoded = new byte[size];
decoded = Base64.decodeBase64(encoded); //<-- Getting error here
String path = "D:\\myImage.png";
OutputStream out1 = new BufferedOutputStream(
new FileOutputStream(path));
out1.write(decoded);
}
if (qr.isDone()) {
done = true;
} else {
qr = partnerConnection.queryMore(qr.getQueryLocator());
}
}
} catch (ConnectionException ce) {
ce.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
}
System.out.println("\nQuery execution completed.");
}
public static byte[] serialize(Object obj) throws IOException {
ByteArrayOutputStream b = new ByteArrayOutputStream();
ObjectOutputStream o = new ObjectOutputStream(b);
o.writeObject(obj);
return b.toByteArray();
}