apiClient = $apiClient; $this->targetFolderId = $targetFolderId; } /** * Upload a file to DAM with metadata * * @param string $filePath Local file path * @param string $folderId Target folder ID (campaign folder) * @param array $metadata Optional metadata to set * @return array Upload result */ public function uploadFile($filePath, $folderId, $metadata = []) { if (!file_exists($filePath)) { return [ 'success' => false, 'error' => 'File not found: ' . $filePath ]; } $filename = basename($filePath); $mimeType = mime_content_type($filePath); // Build multipart form data $boundary = '----WebKitFormBoundary' . uniqid(); // Build asset representation JSON $assetRepresentation = $this->buildAssetRepresentation($filename, $metadata); // Build multipart body $body = ''; // Add asset_representation part $body .= "--{$boundary}\r\n"; $body .= "Content-Disposition: form-data; name=\"asset_representation\"\r\n"; $body .= "Content-Type: application/json\r\n\r\n"; $body .= json_encode($assetRepresentation) . "\r\n"; // Add parent_folder_id part $body .= "--{$boundary}\r\n"; $body .= "Content-Disposition: form-data; name=\"parent_folder_id\"\r\n\r\n"; $body .= $folderId . "\r\n"; // Add file part $body .= "--{$boundary}\r\n"; $body .= "Content-Disposition: form-data; name=\"file\"; filename=\"{$filename}\"\r\n"; $body .= "Content-Type: {$mimeType}\r\n\r\n"; $body .= file_get_contents($filePath) . "\r\n"; $body .= "--{$boundary}--\r\n"; // Make upload request $request = [ 'method' => 'POST', 'url' => '/v6/assets', 'body' => $body ]; // Set multipart content-type header $this->apiClient->setHeader('Content-Type', "multipart/form-data; boundary={$boundary}"); $response = $this->apiClient->executeRequest($request); if ($response['success'] && $response['http_code'] == 201) { $responseData = json_decode($response['body'], true); return [ 'success' => true, 'asset_id' => $responseData['asset_resource_list']['asset_resource'][0]['asset']['asset_id'] ?? null, 'filename' => $filename, 'response' => $responseData ]; } return [ 'success' => false, 'error' => 'Upload failed', 'http_code' => $response['http_code'], 'response' => $response['body'] ]; } /** * Build asset representation for upload */ private function buildAssetRepresentation($filename, $metadata = []) { $assetRep = [ 'asset_resource' => [ 'asset' => [ 'metadata' => [ 'metadata_element_list' => [] ] ] ] ]; // Add filename metadata $assetRep['asset_resource']['asset']['metadata']['metadata_element_list'][] = [ 'id' => 'ARTESIA.FIELD.ASSET NAME', 'type' => 'com.artesia.metadata.MetadataField', 'value' => [ 'cascading_domain_value' => false, 'domain_value' => false, 'value' => [ 'type' => 'string', 'value' => $filename ] ] ]; // Add custom metadata fields foreach ($metadata as $fieldId => $fieldValue) { $assetRep['asset_resource']['asset']['metadata']['metadata_element_list'][] = [ 'id' => $fieldId, 'type' => 'com.artesia.metadata.MetadataField', 'value' => [ 'cascading_domain_value' => false, 'domain_value' => false, 'value' => [ 'type' => 'string', 'value' => $fieldValue ] ] ]; } return $assetRep; } /** * Upload multiple files */ public function uploadMultipleFiles($files, $folderId, $metadata = []) { $results = [ 'total' => count($files), 'successful' => 0, 'failed' => 0, 'details' => [] ]; foreach ($files as $file) { $result = $this->uploadFile($file, $folderId, $metadata); if ($result['success']) { $results['successful']++; } else { $results['failed']++; } $results['details'][] = $result; } return $results; } }