*** Updated:
I'm using the FedEx REST API for image upload (/documents/v1/lhsimages/upload
), and I'm getting back an error:
[errors] => stdClass Object
(
[code] => 1001
[message] => Invalid request: invalid input : Invalid document details
)
I suspect the issue might be related to how I'm passing the data up - typically in a cURL request for the FedEx API you would do
curl_setopt($ch, CURLOPT_POSTFIELDS, $this->apiRequest);
where $this->apiRequest
is a json encoded request body. This works for other API requests. But the Upload Image is a bit tricky because it contains field data plus a file:
document: {"document": {"referenceId": "1234", "name": "LH2.PNG", "contentType": "image/png", "meta": { "imageType": "SIGNATURE","imageIndex": "IMAGE_1"}},"rules": {"workflowName": "LetterheadSignature" }}
attachment: file.PNG
What I was passing was
$body = (object)[
'referenceId' => 'Signature',
'name' => $filename,
'contentType' => $filetype,
'rules' => (object)[
'workflowName' => 'LetterheadSignature',
],
'meta' => (object)[
'imageType' => 'SIGNATURE',
'imageIndex' => 'IMAGE_1',
]
];
$sent_data = [
'document' => json_encode($body),
'attachment' => $file,
];
$this->apiRequest = $sent_data;
I tried building $file
parameter two ways:
$handle = fopen($full_filename, "r");
$file_contents = fread($handle, filesize($full_filename));
fclose($handle);
$file = base64_encode($file_contents);
and also:
$file = curl_file_create($full_filename, $filetype, $filename);
where
$filename = 'image-of-signature.png';
$filetype = 'image/png';
$full_filename = 'path-to-file' . $filename;
Neither worked; both gave me the Invalid request: invalid input : Invalid document details
1001 error.
The FedEx documentation describes the attachment
parameter as:
string <file>
Input the actual document/file to be uploaded.
I have also tried passing the actual path to the file, and of course that doesn't work either.
Contrary to what is shown in the FedEx API documentation, the document
element and the rules
element are at the same level. The correct structure for the body
is
$body = (object)[
'document' => (object)[
'referenceId' => 'Letterhead',
'name' => $filename,
'contentType' => $filetype,
'meta' => (object)[
'imageType' => 'LETTERHEAD',
'imageIndex' => 'IMAGE_2',
],
],
'rules' => (object)[
'workflowName' => 'LetterheadSignature',
]
];