How To Upload a File Attachment Using Service Now API

This tutorial help to upload attachment into service-now using API. I am using service now attachment API to upload file into the existing SCR request.

I am taking laravel API sample to demonstrate upload functionality, You can convert this PHP source code into any other language, You can take reference from here and implement it into your preferred language.

The Attachment API allows you to upload and query file attachments. You can upload or retrieve a single file with each request.

Add a file Attachment in Using Service Now API

Let’s create a file TestController.php into Http/Controller/ folder, which ll have all code to upload a file.

Step 1: Created an API endpoint into the routes/api.php file.

$api->post('/add_attachment/{scr}', 'App\Http\Controllers\TestController@uploadScrFile');

Step 2: Created a client into the service file, I have created a client method into the testController.php file.

private function _client($content_type) {
     $base64 = base64_encode(getenv('USER').":".getenv('PASS'));
     $endpoint = getenv('API_URL');
     $client = new Client([
          'base_uri' => $endpoint,
          'timeout' => 300.0,
          'headers' => ['Content-Type' => $content_type, 'Authorization' => "Basic " . $base64],
          'http_errors' => false,
          'verify' => false
      ]);
     return $client;
}

Step 3: Created a method that will use to upload a file into service now.

public function uploadScrFile($scrNum, $file) {
  $content_type = $file->getMimeType();
  $file_name = $file->getClientOriginalName();
  return array('content_type' => $content_type, 'file_name' => $file_name);
  //echo '<pre/>';print_r($file_name);die;
   $scrRes = $this->findScrByName($scrNum);
   $sysid = head($scrRes['results'])['sys_id']['value'];

   $client = $this->_client($content_type);
   \Log::info("Attach File in SCR");
  try {
     \Log::info("SCR number:", array("SCR" => $scrNum));
     $response = $client->post("attachment/file?table_name=test&table_sys_id=$sysid&file_name=$file_name", ['body' => fopen($file->getRealPath(), "r")]);
     $response = json_decode($response->getBody(), true);
     return ['results' => $response['result']];
   } catch (\Exception $ex) {
     throw new BadRequestException('bad_req', $ex->getMessage());
   }
}

Step 4: Finally, Create a controller method that will call the service method to upload a file.

public function uploadScrFile(Request $request, $scr) {
  $file = $request->files->get('file');      
  return $this->response->array((array) $this->uploadScrFile($scr, $file));
}