Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Visual search file upload #635

Open
wants to merge 4 commits into
base: master
Choose a base branch
from

Conversation

cloudinary-pkoniu
Copy link
Contributor

Brief Summary of Changes

  • new feature: visual search using file upload:
cloudinary.v2.api.visual_search({image_file: 'path/to/file'}, function (error, result) {
    console.log(result);
});

or

cloudinary.v2.api.visual_search({image_file: Buffer.from('abc')}, function (error, result) {
    console.log(result);
});

What Does This PR Address?

  • GitHub issue (Add reference - #XX)
  • Refactoring
  • New feature
  • Bug fix
  • Adds more tests

Are Tests Included?

  • Yes
  • No

Reviewer, Please Note:

I added the requests dependency because writing an http request with multi-part file upload using vanilla node is a complicated task and to be honest, I failed at that. I tried writing it from scratch and also reusing some components from the upload.js file but the way this sdk is designed does not allow reusing some of the functions there. At least not in an easy way that won't potentially mean a broken contract. Eventually, I'd prefer doing all http requests using an external library rather than avoiding adding it in the first place - to me, the cost of maintaining low level code is much higher than adding this single dependency.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks ok but please see my comments.

lib/api_client/execute_request.js Outdated Show resolved Hide resolved
lib/api_client/execute_request.js Show resolved Hide resolved
@devhwann
Copy link

devhwann commented Jan 2, 2025

. Updated Implementation
To simplify HTTP requests and file uploads, I replaced the manual multipart handling with axios and form-data libraries. These changes make the code more maintainable and minimize compatibility issues with the existing SDK design. Below is the updated code:

javascript
const axios = require('axios');
const fs = require('fs');
const FormData = require('form-data');


/**
 * Visual Search with File Upload
 * @param {string} filePath - Path to the image file to be uploaded.
 * @returns {Promise<object>} - API response.
 */
async function visualSearchWithFile(filePath) {
    try {
        const formData = new FormData();
        formData.append('image_file', fs.createReadStream(filePath));

        const response = await axios.post(
            'https://api.cloudinary.com/v1_1/demo/visual_search',
            formData,
            { headers: formData.getHeaders() }
        );

        console.log('Search Results:', response.data);
        return response.data;
    } catch (error) {
        console.error('Error in visual search:', error.message);
        throw error;
    }
}

// Example usage
visualSearchWithFile('./path/to/image.jpg')
.then((result) => console.log('Success:', result))
.catch((err) => console.error('Failed:', err));
2. Why Use External Libraries?
axios: A reliable and widely used HTTP request library, ensuring robust handling of network operations.
form-data: Simplifies multipart file uploads and guarantees compatibility with the API’s requirements.
Compared to manual implementation, this approach reduces complexity and maintenance overhead.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants