There are a variety of ways to migrate your existing images to Cloudinary, both using the UI and the API.
Via The API
Cloudinary's upload API- the upload API only supports a single file upload at a time, but it does have a high concurrency rate, so you can write a script and use multi-threads (up to 10 threads) to upload many files at once. You can also use asynchronous calls, and tell Cloudinary to do the upload in the background by adding the 'async' parameter and setting it to 'true'. We recommend using one of our SDKs for this purpose.
Note that there is no rate limit on the upload API method, with that said, there is a concurrency limit when performing many simultaneous operations. You can preform up to 10 simultaneous upload requests. If you need to upload using more than 10 threads please contact our support.
To speed up the upload process, you can provide a file's existing HTTP/HTTPS, S3, or Google Cloud Storage URL as the file parameter to the upload API instead of sending the actual data. This allows for a much faster migration process because we can retrieve the images from the specified location instead of your code needing to download and upload the files to us.
To specify S3 or Google Cloud Storage URLs, please ensure that the bucket can be accessed by Cloudinary and that you've specified which Cloudinary accounts should be allowed to copy images from the bucket. More info here.
Via the Media Library UI
Media Library upload widget - Selecting multiple files at once, including dragging and dropping folders onto the Media Library window.
The Media Library uses the upload API method so it is not rate limited as well.
Auto-upload remote resources - This feature allows you to link a folder in your Cloudinary account with a corresponding folder on your existing server or in an existing Amazon S3 bucket or Google Cloud Storage bucket. This would upload the images lazily (i.e., every time they are specifically called by the end-user).