Upload Files to Zoho File System (ZFS)

Purpose

ZFS is the central storage system to all your files and attachments. Use this API to upload fields to ZFS. This API returns an encrypted file ID and the file name. You can use this encrypted ID to attach this file to a file/image upload field or a record in Zoho CRM. You must upload the file with content type as multipart/form data.

Endpoints

Request Details

Request URL

https://www.zohoapis.com/crm/v2/files

Header

Authorization: Zoho-oauthtoken d92d4xxxxxxxxxxxxx15f52

Scope

scope=ZohoCRM.Files.{operation_type}

Possible operation types

CREATE - To add files to ZFS

Parameters

  • typestring, optional

    To upload inline images.
    Resolution: The value is inline.

Sample Request

Copiedcurl "https://www.zohoapis.com/crm/v2/files"
-X POST
-H "Authorization: Zoho-oauthtoken 1000.8cb99dxxxxxxxxxxxxx9be93.9b8xxxxxxxxxxxxxxxf"
-F "file=@connections.txt"
-F "file=@enable-signals.png"
3.0.08.0
Copied//Get instance of RecordOperations Class
FileOperations fileOperations = new FileOperations();

BodyWrapper bodyWrapper = new BodyWrapper();

//Get instance of StreamWrapper class that takes absolute path of the file to be attached as parameter
StreamWrapper streamWrapper = new StreamWrapper("/Users/Desktop/py.html");

//Get instance of StreamWrapper class that takes absolute path of the file to be attached as parameter
StreamWrapper streamWrapper1 = new StreamWrapper("/Users/Desktop/download.png");

//Get instance of StreamWrapper class that takes absolute path of the file to be attached as parameter
StreamWrapper streamWrapper2 = new StreamWrapper("/Users/Desktop/samplecode.txt");

bodyWrapper.setFile(new ArrayList < > (Arrays.asList(streamWrapper, streamWrapper1, streamWrapper2)));

ParameterMap paramInstance = new ParameterMap();

//Call uploadFile method that takes BodyWrapper instance as parameter.
APIResponse < ActionHandler > response = fileOperations.uploadFile(bodyWrapper, paramInstance);
Copiedpackage com.zoho.crm.api.sample.restapi.files;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import javax.net.ssl.SSLContext;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.ByteArrayBody;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
public class UploadFilestoZohoFileSystem 
{
	public static void main(String[] args) 
	{
		try
		{
			HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
			SSLContext sslContext = SSLContext.getDefault();
			SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);
			CloseableHttpClient httpclient = httpClientBuilder.setSSLSocketFactory(sslConnectionSocketFactory).build();
			URIBuilder uriBuilder = new URIBuilder("https://www.zohoapis.com/crm/v2/files");
			uriBuilder.addParameter("type", "inline");
			HttpUriRequest requestObj = new HttpPost(uriBuilder.build());
			HttpEntityEnclosingRequestBase requestBase = (HttpEntityEnclosingRequestBase) requestObj;
			requestObj.addHeader("Authorization", "Zoho-oauthtoken 1000.xxxxxxx.xxxxxxx");
			MultipartEntityBuilder multipartEntity = MultipartEntityBuilder.create();
			java.io.File file = new java.io.File("/Users/username/Documents/Leads.zip");
			@SuppressWarnings("resource")
			InputStream stream = new FileInputStream(file);
			byte[] buffer = new byte[8192];
			ByteArrayOutputStream output = new ByteArrayOutputStream();
			int bytesRead;
			while ((bytesRead = stream.read(buffer)) != -1)
			{
			    output.write(buffer, 0, bytesRead);
			}
			multipartEntity.addPart("file", new ByteArrayBody(output.toByteArray(), file.getName()));
			java.io.File file1 = new java.io.File("/Users/username/Desktop/zoho.jpeg");
			@SuppressWarnings("resource")
			FileInputStream stream1 = new FileInputStream(file1);
			buffer = new byte[8192];
			output = new ByteArrayOutputStream();
			while ((bytesRead = stream1.read(buffer)) != -1)
			{
			    output.write(buffer, 0, bytesRead);
			}
			multipartEntity.addPart("file", new ByteArrayBody(output.toByteArray(), file1.getName()));
			requestBase.setEntity(multipartEntity.build());
			HttpResponse response = httpclient.execute(requestObj);
			HttpEntity responseEntity = response.getEntity();
			Object responseObject = EntityUtils.toString(responseEntity);
			String responseString = responseObject.toString();
			System.out.println(responseString);
		}
		catch(Exception ex)
		{
			ex.printStackTrace();
		}
	}
}
3.0.07.x
Copied//Get instance of RecordOperations Class
$fileOperations = new FileOperations();
//Get instance of FileBodyWrapper Class that will contain the request body
$bodyWrapper = new BodyWrapper();
//Get instance of StreamWrapper class that takes absolute path of the file to be attached as parameter
$streamWrapper = new StreamWrapper(null, null, "/Users/abc-123/Desktop/py.html");
//Get instance of StreamWrapper class that takes absolute path of the file to be attached as parameter
$streamWrapper1 = new StreamWrapper(null, null, "/Users/abc-123/Desktop/download.png");
//Get instance of StreamWrapper class that takes absolute path of the file to be attached as parameter
$streamWrapper2 = new StreamWrapper(null, null, "/Users/abc-123/Desktop/samplecode.txt");
//Set file to the FileBodyWrapper instance
$bodyWrapper->setFile([$streamWrapper, $streamWrapper1, $streamWrapper2 ]);
//Get instance of ParameterMap Class
$paramInstance = new ParameterMap();
//Call uploadFile method that takes BodyWrapper instance as parameter.
$response = $fileOperations->uploadFile($bodyWrapper, $paramInstance);
Copied<?php

class UploadFilestoZohoFileSystem
{
	public function execute(){
        $curl_pointer = curl_init();
        
        $curl_options = array();
        $curl_options[CURLOPT_URL] = "https://www.zohoapis.com/crm/v2/files";
        $curl_options[CURLOPT_RETURNTRANSFER] = true; 
        $curl_options[CURLOPT_HEADER] = 1;
        $curl_options[CURLOPT_CUSTOMREQUEST] = "POST";
        $fileName = "asdad.zip";
        $filePath = "/Users/test/PHP/PHPNativeSampleCode/asdad.zip";
        $file = fopen($filePath, "rb");
        $fileData = fread($file, filesize($filePath));
        $date = new \DateTime();
        
        $current_time_long= $date->getTimestamp();
        
        $lineEnd = "\r\n";
        
        $hypen = "--";
        
        $contentDisp = "Content-Disposition: form-data; name=\""."file"."\";filename=\"".$fileName."\"".$lineEnd.$lineEnd;
        
        
        $data = utf8_encode($lineEnd);
        
        $boundaryStart = utf8_encode($hypen.(string)$current_time_long.$lineEnd) ;
        
        $data = $data.$boundaryStart;
        
        $data = $data.utf8_encode($contentDisp);
        
        $data = $data.$fileData.utf8_encode($lineEnd);
        
        $boundaryend = $hypen.(string)$current_time_long.$hypen.$lineEnd.$lineEnd;
        
        $data = $data.utf8_encode($boundaryend);
        
        $curl_options[CURLOPT_POSTFIELDS]= $data;
        $headersArray = array();
        
        $headersArray = ['ENCTYPE: multipart/form-data','Content-Type:multipart/form-data;boundary='.(string)$current_time_long];
        $headersArray[] = "content-type".":"."multipart/form-data";
        $headersArray[] = "Authorization". ":" . "Zoho-oauthtoken " ."1000.8cb99dxxxxxxxxxxxxx9be93.9b8xxxxxxxxxxxxxxxf";
        var_dump($data);

        $curl_options[CURLOPT_HTTPHEADER]=$headersArray;
        
        curl_setopt_array($curl_pointer, $curl_options);

        $result = curl_exec($curl_pointer);
        $responseInfo = curl_getinfo($curl_pointer);
        curl_close($curl_pointer);
        list ($headers, $content) = explode("\r\n\r\n", $result, 2);
        if(strpos($headers," 100 Continue")!==false){
            list( $headers, $content) = explode( "\r\n\r\n", $content , 2);
        }
        $headerArray = (explode("\r\n", $headers, 50));
        $headerMap = array();
        foreach ($headerArray as $key) {
            if (strpos($key, ":") != false) {
                $firstHalf = substr($key, 0, strpos($key, ":"));
                $secondHalf = substr($key, strpos($key, ":") + 1);
                $headerMap[$firstHalf] = trim($secondHalf);
            }
        }
        $jsonResponse = json_decode($content, true);
        if ($jsonResponse == null && $responseInfo['http_code'] != 204) {
            list ($headers, $content) = explode("\r\n\r\n", $content, 2);
            $jsonResponse = json_decode($content, true);
        }
        var_dump($headerMap);
        var_dump($jsonResponse);
        var_dump($responseInfo['http_code']);
       
    }
    
}
(new UploadFilestoZohoFileSystem())->execute();
3.0.08.x
Copied//Get instance of RecordOperations Class
FileOperations fileOperations = new FileOperations();
//Get instance of FileBodyWrapper Class that will contain the request body
BodyWrapper bodyWrapper = new BodyWrapper();
//Get instance of StreamWrapper class that takes absolute path of the file to be attached as parameter
StreamWrapper streamWrapper = new StreamWrapper("/Users/abc-123/Desktop/py.html");
//Get instance of StreamWrapper class that takes absolute path of the file to be attached as parameter
StreamWrapper streamWrapper1 = new StreamWrapper("/Users/abc-123/Desktop/download.png");
//Get instance of StreamWrapper class that takes absolute path of the file to be attached as parameter
StreamWrapper streamWrapper2 = new StreamWrapper("/Users/abc-123/Desktop/samplecode.txt");
//Set file to the FileBodyWrapper instance
bodyWrapper.File = new List<StreamWrapper>() { streamWrapper, streamWrapper1, streamWrapper2 };
//Get instance of ParameterMap Class
ParameterMap paramInstance = new ParameterMap();
//Call uploadFile method that takes BodyWrapper instance as parameter.
APIResponse<ActionHandler> response = fileOperations.UploadFile(bodyWrapper, paramInstance);
Copiedusing System;
using System.Collections.Generic;
using System.IO;
using System.Net;
namespace Com.Zoho.Crm.API.Sample.RestAPI.Files
{
    public class UploadFilestoZohoFileSystem
    {
        public static void UploadFiles()
        {
            string boundary = "----FILEBOUNDARY----";
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.zohoapis.com/crm/v2/files");
            request.ContentType = "multipart/form-data; boundary=" + boundary;
            request.Method = "POST";
            request.Headers["Authorization"] = "Zoho-oauthtoken 1000.abfeXXXXXXXXXXX2asw.XXXXXXXXXXXXXXXXXXsdc2";
            request.KeepAlive = true;
            Stream memStream = new System.IO.MemoryStream();
            var boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
            var endBoundaryBytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--");
            string formdataTemplate = "\r\n--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\";\r\n\r\n{1}";
            string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n" + "Content-Type: application/octet-stream\r\n\r\n";
            FileInfo fileInfo = new FileInfo("/Users/abc-123/Desktop/test.html");
            FileInfo fileInfo1 = new FileInfo("/Users/abc-123/Desktop/test.html");
            List<FileInfo> fileInfoList = new List<FileInfo>() { fileInfo, fileInfo1 };
            for (int i = 0; i < fileInfoList.Count; i++)
            {
                FileInfo fileInstance = fileInfoList[i];
                string name = fileInstance.Name;
                Stream stream = fileInstance.OpenRead();
                memStream.Write(boundarybytes, 0, boundarybytes.Length);
                var header = string.Format(headerTemplate, "file", name);
                var headerbytes = System.Text.Encoding.UTF8.GetBytes(header);
                memStream.Write(headerbytes, 0, headerbytes.Length);
                var buffer = new byte[1024];
                var bytesRead = 0;
                while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) != 0)
                {
                    memStream.Write(buffer, 0, bytesRead);
                }
            }
            memStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);
            request.ContentLength = memStream.Length;
            using (Stream requestStream = request.GetRequestStream())
            {
                memStream.Position = 0;
                byte[] tempBuffer = new byte[memStream.Length];
                memStream.Read(tempBuffer, 0, tempBuffer.Length);
                memStream.Close();
                requestStream.Write(tempBuffer, 0, tempBuffer.Length);
            }
            HttpWebResponse response;
            try
            {
                response = (HttpWebResponse)request.GetResponse();
            }
            catch (WebException e)
            {
                if (e.Response == null) { throw; }
                response = (HttpWebResponse)e.Response;
            }
            HttpWebResponse responseEntity = response;
            string responsestring = new StreamReader(responseEntity.GetResponseStream()).ReadToEnd();
            responseEntity.Close();
            Console.WriteLine(responsestring);
        }
    }
}
3.0.03.x.x
Copied# Get instance of FileOperations Class
file_operations = FileOperations()
# Get instance of ParameterMap Class
param_instance = ParameterMap()
# Possible parameters of UploadFile operation
param_instance.add(UploadFileParam.type, "inline")
# Get instance of FileBodyWrapper Class that will contain the request body
request = BodyWrapper()
"""
StreamWrapper can be initialized in any of the following ways
* param 1 -> fileName 
* param 2 -> Read Stream.
"""
# stream_wrapper = StreamWrapper(stream=open(absolute_file_path, 'rb'))
"""
* param 1 -> fileName
* param 2 -> Read Stream
* param 3 -> Absolute File Path of the file to be attached
"""
stream_wrapper1 = StreamWrapper(file_path="/Users/user_name/Desktop/file1.txt")
stream_wrapper2 = StreamWrapper(file_path="/Users/user_name/Desktop/file2.txt")
stream_wrapper3 = StreamWrapper(file_path="/Users/user_name/Desktop/file3.txt")
# Set list of files to the BodyWrapper instance
request.set_file([stream_wrapper1, stream_wrapper2, stream_wrapper3])
# Call upload_file method that takes BodyWrapper instance as parameter.
response = file_operations.upload_files(request, param_instance)
Copieddef upload_files_to_zfs():
    import requests

    url = 'https://www.zohoapis.com/crm/v2/files'

    headers = {
        'Authorization': 'Zoho-oauthtoken 1000.04be928e4a96XXXXXXXXXXXXX68.0b9eXXXXXXXXXXXX60396e268'
    }

    parameters = {
        'type': 'inline'
    }

    request_body = []
    file_1_tuple = ('file', open('/Users/abc-123/Desktop/img_1.png', 'rb'))
    file_2_tuple = ('file', open('/Users/abc-123/Desktop/img_2.png', 'rb'))
    request_body.append(file_1_tuple)
    request_body.append(file_2_tuple)

    response = requests.post(url=url, files=request_body, headers=headers, params=parameters)

    if response is not None:
        print("HTTP Status Code : " + str(response.status_code))

        print(response.json())

upload_files_to_zfs()
1.0.010.x
Copied//Get instance of FileOperations Class
let fileOperations = new FileOperations();
//Get instance of FileBodyWrapper Class that will contain the request body
let request = new BodyWrapper();
let paramInstance = new ParameterMap();
await paramInstance.add(UploadFilesParam.TYPE, "inline");
let files = [];
/** StreamWrapper can be initialized in any of the following ways */ 
/**
 * param 1 -> fileName 
 * param 2 -> Read Stream.
 */
let streamWrapper1 = new StreamWrapper(null, fs.createReadStream("/Users/user_name/Desktop/file1.txt"));
let streamWrapper3 = new StreamWrapper(null, fs.createReadStream("/Users/user_name/Desktop/file2.txt"));
/**
 * param 1 -> fileName
 * param 2 -> Read Stream
 * param 3 -> Absolute File Path of the file to be attached
 */
let streamWrapper2 = new StreamWrapper(null, null, "/Users/user_name/Desktop/file3.txt");

files.push(streamWrapper1);
files.push(streamWrapper2);
files.push(streamWrapper3);
//Set files to the FileBodyWrapper instance
request.setFile(files);
//Call uploadFile method that takes BodyWrapper instance and ParameterMap instance as parameter.
let response = await fileOperations.uploadFiles(request, paramInstance);
Copiedasync function uploadFilesToZFS() {
    const got = require("got");
    const FormData = require("form-data");
    const fs = require("fs");

    let url = 'https://www.zohoapis.com/crm/v2/files'
    
    let headers = {
        Authorization : "Zoho-oauthtoken 1000.8cb99dxxxxxxxxxxxxx9be93.9b8xxxxxxxxxxxxxxxf"
    }

    let parameters = {
        type : 'inline'
    }

    let requestBody = new FormData()
    requestBody.append('file', fs.createReadStream('/Users/abc-123/Desktop/img_1.png'))
    requestBody.append('file', fs.createReadStream('/Users/abc-123/Desktop/img_2.png'))

    let requestDetails = {
        method : "POST",
        headers : headers,
        searchParams : parameters,
        body : requestBody,
        encoding: "utf8",
        throwHttpErrors : false
    }

    let response = await got(url, requestDetails)
    
    if(response != null) {
        console.log(response.statusCode);
        console.log(response.body);
    }
}
uploadFilesToZFS()
2.02.x.x
Copied# Get instance of FileOperations Class
fo = Files::FileOperations.new
# Get instance of FileBodyWrapper Class that will contain the request body
bw = Files::BodyWrapper.new
# """
# StreamWrapper can be initialized in any of the following ways

# * param 1 -> fileName
# * param 2 -> Read Stream.
# * param 3 -> Absolute File Path of the file to be attached
# """
# stream_wrapper = StreamWrapper.new(name,stream,absolutefilepath)
# Get instance of ParameterMap Class
pm = ParameterMap.new
pm.add(Files::FileOperations::UploadFileParam.type, 'inline')
sw1 = Util::StreamWrapper.new(nil, nil, '/Users/user_name/RUBYWS/zohocrm-rubysdk-sample-application/3524033000005520002.zip')
sw2 = Util::StreamWrapper.new(nil, nil, '/Users/user_name/RUBYWS/zohocrm-rubysdk-sample-application/3524033000005902005.zip')
# Set list of files to the BodyWrapper instance
files = [sw1, sw2]
bw.file = files
# Call upload_file method that takes BodyWrapper instance as parameter.
response = fo.upload_file(bw, pm)
Copiedclass UploadFilestoZohoFileSystem 

    def execute
      
        url = "https://www.zohoapis.com/crm/v2/files"
        url = URI(url)
        req = Net::HTTP::Post.new(url.request_uri)
        http = Net::HTTP.new(url.host, url.port)
        http.use_ssl = true
        headers={}
        headers["Authorization"]="Zoho-oauthtoken 1000.50XXXXXXXXX&77e3a.44XXXXXXXXX8353"
        headers&.each { |key, value| req.add_field(key, value) }
        file_path = "/Users/test/Desktop/pic.png"
        file = File.open(file_path)
        data=[["file",file.read, { filename: "pic.png" }]]
        req.set_form(data,'multipart/form-data')
        response=http.request(req)
        status_code = response.code.to_i
        headers = response.each_header.to_h
        print status_code
        print headers
        unless response.body.nil?
            print  response.body
        end
    end
end
UploadFilestoZohoFileSystem.new.execute
1.0.0ES6
Copied//Get instance of FileOperations Class
let fileOperations = new ZCRM.File.Operations();
//Get instance of FileBodyWrapper Class that will contain the request body
let request = new ZCRM.File.Model.BodyWrapper();
let paramInstance = new ParameterMap();
await paramInstance.add(ZCRM.File.Model.UploadFilesParam.TYPE, "inline");
/** StreamWrapper can be initialized in any of the following ways */
var filesToLoad  = document.getElementById("file_api").files;
var files = [];
for(var fileData of filesToLoad) {
    /**
     * param 1 -> fileName
     * param 2 -> Read Stream.
     */
    let streamWrapper = new StreamWrapper.Model.StreamWrapper(null, fileData);
    files.push(streamWrapper);
}
request.setFile(files);
//Call uploadFile method that takes BodyWrapper instance as parameter.
let response = await fileOperations.uploadFiles(request, paramInstance);
Copiedvar listener = 0;
class UploadFilestoZohoFileSystem {

	async uploadFiles()	{
		var url = "https://www.zohoapis.com/crm/v2/files"
        var parameters = new Map()
        var headers = new Map()
        var token = {
            clientId:"1000.NPY9M1V0XXXXXXXXXXXXXXXXXXXF7H",
            redirectUrl:"http://127.0.0.1:5500/redirect.html",
            scope:"ZohoCRM.users.ALL,ZohoCRM.bulk.read,ZohoCRM.modules.ALL,ZohoCRM.settings.ALL,Aaaserver.profile.Read,ZohoCRM.org.ALL,profile.userphoto.READ,ZohoFiles.files.ALL,ZohoCRM.bulk.ALL,ZohoCRM.settings.variable_groups.ALL"
        }
        var accesstoken = await new UploadFilestoZohoFileSystem().getToken(token)
        headers.set("Authorization", "Zoho-oauthtoken " + accesstoken)
        parameters.set("type", "inline")
        var filesToLoad  = document.getElementById("files").files;
        var file = filesToLoad[0];

        var requestMethod = "POST"
        var formDataRequestBody = new FormData();
        formDataRequestBody.append("file", new Blob([file]),file.name);
        var reqBody = formDataRequestBody
        var params = "";
        parameters.forEach(function(value, key) {
            if (parameters.has(key)) {
                if (params) {
                    params = params + key + '=' + value + '&';
                }
                else {
                    params = key + '=' + value + '&';
                }
            }
        });
        var apiHeaders = {};
        if(headers) {
            headers.forEach(function(value, key) {
                apiHeaders[key] = value;
            });
        }
        if (params.length > 0){
            url = url + '?' + params.substring(0, params.length - 1);
        }
        var requestObj = {
            uri : url,
            method : requestMethod,
            headers : apiHeaders,
            body : reqBody,
            encoding: "utf8",
            allowGetBody : true,
			throwHttpErrors : false
        };
        var result = await new UploadFilestoZohoFileSystem().makeAPICall(requestObj);
        console.log(result.status)
        console.log(result.response)
    }

    async getToken(token) {

        if(listener == 0) {

            window.addEventListener("storage", function(reponse) {
                if(reponse.key === "access_token" && (reponse.oldValue != reponse.newValue || reponse.oldValue == null)){
                    location.reload();
                }
                if(reponse.key === "access_token"){

                    sessionStorage.removeItem("__auth_process");
                }
            }, false);
            listener = 1;
            if(sessionStorage.getItem("__auth_process")) {
                sessionStorage.removeItem("__auth_process");
            }
        }
        ["granted_for_session", "access_token","expires_in","expires_in_sec","location","api_domain","state","__token_init","__auth_process"].forEach(function (k) {
            var isKeyExists = localStorage.hasOwnProperty(k);
            if(isKeyExists) {
                sessionStorage.setItem(k, localStorage[k]);
            }
            localStorage.removeItem(k);
        });
        var valueInStore = sessionStorage.getItem("access_token");
        var tokenInit = sessionStorage.getItem("__token_init");
        if(tokenInit != null && valueInStore != null && Date.now() >= parseInt(tokenInit) + 59 * 60 * 1000){ // check after 59th minute
            valueInStore = null;
            sessionStorage.removeItem("access_token");
        }

        var auth_process = sessionStorage.getItem("__auth_process");
        if ((valueInStore == null && auth_process == null) || (valueInStore == 'undefined' && (auth_process == null || auth_process == "true"))) {
            var accountsUrl = "https://accounts.zoho.com/oauth/v2/auth"
            var clientId;
            var scope;
            var redirectUrl;
            if(token != null) {
                clientId = token.clientId;
                scope = token.scope;
                redirectUrl = token.redirectUrl;
            }

            var fullGrant = sessionStorage.getItem("full_grant");
            var grantedForSession = sessionStorage.getItem("granted_for_session");
            if(sessionStorage.getItem("__token_init") != null && ((fullGrant != null && "true" == full_grant) || (grantedForSession != null && "true" == grantedForSession))) {
                accountsUrl += '/refresh';
            }
            if (clientId && scope) {
                sessionStorage.setItem("__token_init", Date.now());
                sessionStorage.removeItem("access_token");
                sessionStorage.setItem("__auth_process", "true");
                window.open(accountsUrl + "?" + "scope" + "=" + scope + "&"+ "client_id" +"=" + clientId + "&response_type=token&state=zohocrmclient&redirect_uri=" + redirectUrl);
                ["granted_for_session", "access_token","expires_in","expires_in_sec","location","api_domain","state","__token_init","__auth_process"].forEach(function (k) {
                    var isKeyExists = localStorage.hasOwnProperty(k);
                    if(isKeyExists){
                        sessionStorage.setItem(k, localStorage[k]);
                    }
                    localStorage.removeItem(k);
                });
                valueInStore = sessionStorage.getItem("access_token");
            }
        }
        if(token != null && valueInStore != 'undefined'){
            token.accessToken = valueInStore;
        }
        return token.accessToken;
    }

    async makeAPICall(requestDetails) {
        return new Promise(function (resolve, reject) {
            var body, xhr, i;
            body = requestDetails.body || null;
            xhr = new XMLHttpRequest();
            xhr.withCredentials = true;
            xhr.open(requestDetails.method, requestDetails.uri, true);
            for (i in requestDetails.headers) {
                xhr.setRequestHeader(i, requestDetails.headers[i]);
            }
            xhr.send(body);
            xhr.onreadystatechange = function() {
                if(xhr.readyState == 4) {
                    resolve(xhr);
                }
            }
        })
    }
}
CopiedfileVariable = invokeurl
[
	url: "https://file-examples-com.github.io/uploads/2017/10/file-sample_150kB.pdf"
	type: GET
];
fileVariable.setParamName("file");
response = invokeurl
[
	url :"https://www.zohoapis.com/crm/v2/files"
	type :POST
	files: fileVariable
	connection:"crm_oauth_connection"
];
info response;

Possible Errors

  • failure_in_attachment_handling HTTP 400

    invalid oauth scope to access this URL
    Resolution: Problem in uploading attachment. kindly upload the file properly

  • VIRUS_DETECTEDHTTP 400

    Unable to process your request. Virus has been detected.
    Resolution: A virus is found in the file that you uploaded. Upload a file without any viruses.

  • INVALID_URL_PATTERNHTTP 404

    Please check if the URL trying to access is a correct one
    Resolution: The request URL specified is incorrect. Specify a valid request URL. Refer to request URL section above.

  • OAUTH_SCOPE_MISMATCHHTTP 401

    Unauthorized
    Resolution: Client does not have ZohoCRM.Files.CREATE scope. Create a new client with valid scope. Refer to scope section above.

  • NO_PERMISSIONHTTP 403

    Permission denied to create
    Resolution: The user does not have permission to upload files to ZFS. Contact your system administrator.

  • INTERNAL_ERRORHTTP 500

    Internal Server Error
    Resolution: Unexpected and unhandled exception in Server. Contact support team.

  • INVALID_REQUEST_METHODHTTP 400

    The http request method type is not a valid one
    Resolution: You have specified an invalid HTTP method to access the API URL. Specify a valid request method. Refer to endpoints section above.

  • AUTHORIZATION_FAILEDHTTP 400

    User does not have sufficient privilege to create.
    Resolution: The user does not have the permission to add files to ZFS. Contact your system administrator.

Note
  • The maximum size of each attachment is 20MB.

Sample Response

Copied{
    "data": [
        {
            "code": "SUCCESS",
            "details": {
                "name": "connections.txt",
                "id": "2cceafaxxxxxxxc065186"
            },
            "message": "connections.txt uploaded Succeessfully",
            "status": "success"
        },
        {
            "code": "SUCCESS",
            "details": {
                "name": "enable-signals.png",
                "id": "2ccxxxxxxxxxxxb89e051a"
            },
            "message": "enable-signals.png uploaded Succeessfully",
            "status": "success"
        }
    ]
}