{"id":21245,"date":"2014-07-16T13:45:30","date_gmt":"2014-07-16T13:45:30","guid":{"rendered":"http:\/\/direct_upload_made_easy_from_browser_or_mobile_app_to_the_cloud"},"modified":"2025-02-21T15:55:31","modified_gmt":"2025-02-21T23:55:31","slug":"direct_upload_made_easy_from_browser_or_mobile_app_to_the_cloud","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/direct_upload_made_easy_from_browser_or_mobile_app_to_the_cloud","title":{"rendered":"Direct Image Upload Made Easy, From Browser or Mobile App to the Cloud"},"content":{"rendered":"<div class=\"wp-block-cloudinary-markdown \"><p>Handling <a href=\"https:\/\/cloudinary.com\/documentation\/upload_widget\">user uploaded images and other files<\/a> on your website can be a time consuming task. As images grow larger, uploading and processing them becomes more and more complex. For example, common upload issues for images and other files may relate to browser limitations, server configuration issues, memory and timeout issues.\nSpecifically, handling user <a href=\"https:\/\/cloudinary.com\/features\/file_upload_storage\">uploaded images<\/a> on your website can be a hassle. In this post, we\u2019ll show how Cloudinary\u2019s cloud-based image management service can help you turn user uploading into  <strong>a lightweight operation that bypasses your servers altogether<\/strong>.<\/p>\n<p>How do you handle user <a href=\"https:\/\/cloudinary.com\/features\/file_upload_storage\">file uploads<\/a> today? If images are uploaded directly to your servers, this requires some heavy server-side processing, bandwidth and storage space. One way to offload images is to transfer them to cloud storage. But if you\u2019re handling the upload operation on your own servers (and then transferring them to the cloud), this is still wasteful of server resources.<\/p>\n<p>A smarter option is to enable <strong>uploading of images directly from users\u2019 browsers to the cloud<\/strong>. In a <a href=\"https:\/\/cloudinary.com\/blog\/direct_image_uploads_from_the_browser_to_the_cloud_with_jquery\">previous post<\/a>, we showed how to do this with Cloudinary\u2019s cloud-based image management solution, via our jQuery plugin. We also enable this for mobile apps via the iOS and Android SDKs. But this still requires a small server-side component to handle authentication.<\/p>\n<p>Now we\u2019re happy to introduce a new option that simplifies the upload process and completely bypasses your servers &#8211; <strong>Direct unsigned upload<\/strong>. You can now upload directly from the browser or app to Cloudinary with no predefined authentication. Instead, upload options are controlled by centralized configuration. This is easier to implement and is more suitable for modern client-side and mobile apps with a fast, dynamic UI.<\/p>\n<h2><a name=\"duu\"><\/a>Direct unsigned uploading of images to the cloud: how it works<\/h2>\n<p>Cloudinary is a cloud-based, end-to-end media management solution that automates and streamlines your entire media asset workflow, from upload to transformation to delivery via multiple CDNs.<\/p>\n<p>Previously, we required that all images uploaded are signed with your account\u2019s API secret. Now, you can call Cloudinary\u2019s upload API without signing with your API secret (we call this \u2018unsigned\u2019). This allows you to perform upload directly from a browser or mobile app without going through your servers at all. For security reasons, not all upload parameters can be specified directly when performing unsigned upload calls.<\/p>\n<p>First, you need to enable unsigned uploading for your Cloudinary account from the <strong><a href=\"https:\/\/cloudinary.com\/users\/login?RelayState=%2Fconsole%2Fsettings%2Fupload\">Upload Settings page<\/a><\/strong>. If you don\u2019t have a Cloudinary account already, you can <a href=\"https:\/\/cloudinary.com\/users\/register\/free\">set it up for free<\/a>.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary\/image\/upload\/w_500,q_auto,f_auto\/enable_unsigned_upload.png\" alt=\"Enable unsigned upload\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"500\" height=\"294\"\/><\/p>\n<p>Enabling unsigned uploading creates an \u2018upload preset\u2019 with a unique name, which explicitly allows uploading of images without the API secret. The preset also defines which upload options will be applied to images that are uploaded unsigned.<\/p>\n<p>A preset name is randomly generated by default, to ensure uniqueness. You can edit this default name at any point in time, and define which upload parameters should be applied in this preset. The interface allows you to create presets, list them, edit existing presets and delete unused presets. Read more about upload presets in this post: <a href=\"https:\/\/cloudinary.com\/blog\/centralized_control_for_image_upload_image_size_format_thumbnail_generation_tagging_and_more\">Centralized control for direct image upload<\/a>.<\/p>\n<p>Now, in order to perform unsigned upload, simply call Cloudinary\u2019s upload API while setting the <code>upload_preset<\/code> parameter to the unique name. No need to set the API Key and Secret credentials of your account.<\/p>\n<p>The following code samples show a direct unsigned upload API call in Objective-C for iOS, Java for Android and Ruby:<\/p>\n<cld-code-widget\n      class=\" c-code-widget\"\n      snippets=\"[{&quot;sdkId&quot;:&quot;ruby&quot;,&quot;framework&quot;:&quot;ruby&quot;,&quot;language&quot;:&quot;ruby&quot;,&quot;displayName&quot;:&quot;Ruby&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;rawCodeSnippet&quot;:&quot;Cloudinary::Uploader.unsigned_upload(\\&quot;sample.jpg\\&quot;, \\&quot;zcudy0uz\\&quot;, :cloud_name =&gt; \\&quot;demo\\&quot;)&quot;,&quot;codeSnippet&quot;:&quot;Cloudinary::Uploader.unsigned_upload(\\&quot;sample.jpg\\&quot;, \\&quot;zcudy0uz\\&quot;, :cloud_name =&gt; \\&quot;demo\\&quot;)&quot;},{&quot;sdkId&quot;:&quot;objectivec&quot;,&quot;framework&quot;:&quot;objectivec&quot;,&quot;language&quot;:&quot;c&quot;,&quot;displayName&quot;:&quot;iOS-ObjC&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageVersion&quot;:&quot;3.x&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;rawCodeSnippet&quot;:&quot;CLCloudinary *cloudinary = [[CLCloudinary alloc] init];\\n[cloudinary.config setValue:@\\&quot;demo\\&quot; forKey:@\\&quot;cloud_name\\&quot;];\\n  \\nNSString *imageFilePath = [[NSBundle mainBundle] pathForResource:@\\&quot;logo\\&quot; \\n  ofType:@\\&quot;png\\&quot;];\\n  \\nCLUploader* uploader = [[CLUploader alloc] init:cloudinary delegate:self];\\n[uploader unsignedUpload:imageFilePath uploadPreset:@\\&quot;zcudy0uz\\&quot; options:@{}];&quot;,&quot;codeSnippet&quot;:&quot;CLCloudinary *cloudinary = [[CLCloudinary alloc] init];\\n[cloudinary.config setValue:@\\&quot;demo\\&quot; forKey:@\\&quot;cloud_name\\&quot;];\\n  \\nNSString *imageFilePath = [[NSBundle mainBundle] pathForResource:@\\&quot;logo\\&quot; \\n  ofType:@\\&quot;png\\&quot;];\\n  \\nCLUploader* uploader = [[CLUploader alloc] init:cloudinary delegate:self];\\n[uploader unsignedUpload:imageFilePath uploadPreset:@\\&quot;zcudy0uz\\&quot; options:@{}];&quot;},{&quot;sdkId&quot;:&quot;android&quot;,&quot;framework&quot;:&quot;android&quot;,&quot;language&quot;:&quot;java&quot;,&quot;displayName&quot;:&quot;Android&quot;,&quot;packageName&quot;:&quot;cloudinary-android&quot;,&quot;packageVersion&quot;:&quot;3.x&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;rawCodeSnippet&quot;:&quot;InputStream getAssetStream(String filename) throws IOException {\\n  return getInstrumentation().getContext().getAssets().open(filename);\\n}\\n  \\nMap config = new HashMap();\\nconfig.put(\\&quot;cloud_name\\&quot;, \\&quot;demo\\&quot;);\\nCloudinary cloudinary = new Cloudinary(config);\\n\\ncloudinary.uploader().unsignedUpload(getAssetStream(\\&quot;sample.jpg\\&quot;), \\&quot;zcudy0uz\\&quot;, \\n  Cloudinary.emptyMap());&quot;,&quot;codeSnippet&quot;:&quot;InputStream getAssetStream(String filename) throws IOException {\\n  return getInstrumentation().getContext().getAssets().open(filename);\\n}\\n  \\nMap config = new HashMap();\\nconfig.put(\\&quot;cloud_name\\&quot;, \\&quot;demo\\&quot;);\\nCloudinary cloudinary = new Cloudinary(config);\\n\\ncloudinary.uploader().unsignedUpload(getAssetStream(\\&quot;sample.jpg\\&quot;), \\&quot;zcudy0uz\\&quot;, \\n  Cloudinary.emptyMap());&quot;}]\"\n      parsed-url=\"[]\"\n      with-url=\"false\"\n    >\n      <span class=\"u-visually-hidden\">Loading code examples<\/span>\n    <\/cld-code-widget>\n<h2>Upload options for unsigned image uploads<\/h2>\n<p>The \u2018unsigned upload preset\u2019 discussed in the previous section globally controls all upload requests coming directly from user browsers or mobile apps, which are not signed with the account API Secret. For example, you can define via the preset that after upload, Cloudinary should eagerly generate thumbnails, mark images for moderation, detect faces, analyze colors and more &#8211; and these operations will be performed after every unsigned image upload.<\/p>\n<p>In addition to these global parameters in the \u2018unsigned upload preset\u2019, there are certain parameters you can specify for specific unsigned upload requests: <code>public_id<\/code> to assign a unique identifier to the uploaded image (while not overwriting an existing image with the same ID), <code>tags<\/code> to add tags, <code>folder<\/code> to store the image in a folder, <code>context<\/code> key-value pairs of meta data, and <code>face_coordinates<\/code> to specify custom coordinates for incoming cropping or further thumbnail generation.<\/p>\n<p>The following code samples show a more advanced example: specifying a custom public ID of <code>user_sample_image_1002<\/code>, making it possible to later access the uploaded image, and assigning a tag to simplify management of the images. In addition, we show an example of building a dynamic URL that performs an on-the-fly image transformation: generating a 150&#215;100 face-detection-based thumbnail of the uploaded images for embedding in your application.<\/p>\n<cld-code-widget\n      class=\" c-code-widget\"\n      snippets=\"[{&quot;sdkId&quot;:&quot;ruby&quot;,&quot;framework&quot;:&quot;ruby&quot;,&quot;language&quot;:&quot;ruby&quot;,&quot;displayName&quot;:&quot;Ruby&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;rawCodeSnippet&quot;:&quot;Cloudinary::Uploader.unsigned_upload(\\&quot;sample.jpg\\&quot;, \\&quot;zcudy0uz\\&quot;, :cloud_name =&gt; \\&quot;demo\\&quot;, \\n  :public_id =&gt; \\&quot;user_sample_image_1001\\&quot;, :tags =&gt; \\&quot;ruby_upload\\&quot;)&quot;,&quot;codeSnippet&quot;:&quot;Cloudinary::Uploader.unsigned_upload(\\&quot;sample.jpg\\&quot;, \\&quot;zcudy0uz\\&quot;, :cloud_name =&gt; \\&quot;demo\\&quot;, \\n  :public_id =&gt; \\&quot;user_sample_image_1001\\&quot;, :tags =&gt; \\&quot;ruby_upload\\&quot;)&quot;},{&quot;sdkId&quot;:&quot;objectivec&quot;,&quot;framework&quot;:&quot;objectivec&quot;,&quot;language&quot;:&quot;c&quot;,&quot;displayName&quot;:&quot;iOS-ObjC&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageVersion&quot;:&quot;3.x&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;rawCodeSnippet&quot;:&quot;NSData *imageData = [NSData dataWithContentsOfFile:imageFilePath];\\n\\n[uploader unsignedUpload:imageData uploadPreset:@\\&quot;zcudy0uz\\&quot; options:[NSDictionary dictionaryWithObjectsAndKeys:@\\&quot;user_sample_image_1002\\&quot;, @\\&quot;public_id\\&quot;, @\\&quot;tags\\&quot;, @\\&quot;ios_upload\\&quot;, nil] withCompletion:^(NSDictionary *successResult, NSString *errorResult, NSInteger code, id context) {\\n\\n    if (successResult) {\\n\\n      NSString* publicId = [successResult valueForKey:@\\&quot;public_id\\&quot;];\\n      NSLog(@\\&quot;Upload success. Public ID=%@, Full result=%@\\&quot;, publicId, successResult);\\n      CLTransformation *transformation = [CLTransformation transformation];\\n      [transformation setWidthWithInt: 150];\\n      [transformation setHeightWithInt: 100];\\n      [transformation setCrop: @\\&quot;fill\\&quot;];\\n      [transformation setGravity:@\\&quot;face\\&quot;];\\n     \\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\n      NSLog(@\\&quot;Result: %@\\&quot;, [cloudinary url:publicId options:@{@\\&quot;transformation\\&quot;: transformation, @\\&quot;format\\&quot;: @\\&quot;jpg\\&quot;}]);     \\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\n\\n    } else {\\n\\n      NSLog(@\\&quot;Upload error: %@, %d\\&quot;, errorResult, code); \\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\n\\n    }\\n\\n  } andProgress:^(NSInteger bytesWritten, NSInteger totalBytesWritten, NSInteger totalBytesExpectedToWrite, id context) {\\n    NSLog(@\\&quot;Upload progress: %d\\\/%d (+%d)\\&quot;, totalBytesWritten, totalBytesExpectedToWrite, bytesWritten);\\n  }];&quot;,&quot;codeSnippet&quot;:&quot;NSData *imageData = [NSData dataWithContentsOfFile:imageFilePath];\\n\\n[uploader unsignedUpload:imageData uploadPreset:@\\&quot;zcudy0uz\\&quot; options:[NSDictionary dictionaryWithObjectsAndKeys:@\\&quot;user_sample_image_1002\\&quot;, @\\&quot;public_id\\&quot;, @\\&quot;tags\\&quot;, @\\&quot;ios_upload\\&quot;, nil] withCompletion:^(NSDictionary *successResult, NSString *errorResult, NSInteger code, id context) {\\n\\n    if (successResult) {\\n\\n      NSString* publicId = [successResult valueForKey:@\\&quot;public_id\\&quot;];\\n      NSLog(@\\&quot;Upload success. Public ID=%@, Full result=%@\\&quot;, publicId, successResult);\\n      CLTransformation *transformation = [CLTransformation transformation];\\n      [transformation setWidthWithInt: 150];\\n      [transformation setHeightWithInt: 100];\\n      [transformation setCrop: @\\&quot;fill\\&quot;];\\n      [transformation setGravity:@\\&quot;face\\&quot;];\\n     \\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\n      NSLog(@\\&quot;Result: %@\\&quot;, [cloudinary url:publicId options:@{@\\&quot;transformation\\&quot;: transformation, @\\&quot;format\\&quot;: @\\&quot;jpg\\&quot;}]);     \\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\n\\n    } else {\\n\\n      NSLog(@\\&quot;Upload error: %@, %d\\&quot;, errorResult, code); \\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\u00a0\\n\\n    }\\n\\n  } andProgress:^(NSInteger bytesWritten, NSInteger totalBytesWritten, NSInteger totalBytesExpectedToWrite, id context) {\\n    NSLog(@\\&quot;Upload progress: %d\\\/%d (+%d)\\&quot;, totalBytesWritten, totalBytesExpectedToWrite, bytesWritten);\\n  }];&quot;},{&quot;sdkId&quot;:&quot;android&quot;,&quot;framework&quot;:&quot;android&quot;,&quot;language&quot;:&quot;java&quot;,&quot;displayName&quot;:&quot;Android&quot;,&quot;packageName&quot;:&quot;cloudinary-android&quot;,&quot;packageVersion&quot;:&quot;3.x&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;rawCodeSnippet&quot;:&quot;InputStream getAssetStream(String filename) throws IOException {\\n  return getInstrumentation().getContext().getAssets().open(filename);\\n}\\n  \\nMap config = new HashMap();\\nconfig.put(\\&quot;cloud_name\\&quot;, \\&quot;demo\\&quot;);\\nCloudinary cloudinary = new Cloudinary(config);\\n\\ncloudinary.uploader().unsignedUpload(getAssetStream(\\&quot;sample.jpg\\&quot;), \\&quot;zcudy0uz\\&quot;, \\n  Cloudinary.asMap(\\&quot;public_id\\&quot;, \\&quot;user_sample_image_1001\\&quot;, \\&quot;tags\\&quot;, \\&quot;android_upload\\&quot;));&quot;,&quot;codeSnippet&quot;:&quot;InputStream getAssetStream(String filename) throws IOException {\\n  return getInstrumentation().getContext().getAssets().open(filename);\\n}\\n  \\nMap config = new HashMap();\\nconfig.put(\\&quot;cloud_name\\&quot;, \\&quot;demo\\&quot;);\\nCloudinary cloudinary = new Cloudinary(config);\\n\\ncloudinary.uploader().unsignedUpload(getAssetStream(\\&quot;sample.jpg\\&quot;), \\&quot;zcudy0uz\\&quot;, \\n  Cloudinary.asMap(\\&quot;public_id\\&quot;, \\&quot;user_sample_image_1001\\&quot;, \\&quot;tags\\&quot;, \\&quot;android_upload\\&quot;));&quot;}]\"\n      parsed-url=\"[]\"\n      with-url=\"false\"\n    >\n      <span class=\"u-visually-hidden\">Loading code examples<\/span>\n    <\/cld-code-widget>\n<p>The response of the API call includes the public ID of the uploaded image, URLs for accessing the image through a CDN and additional details. Here\u2019s another example of Cloudinary\u2019s dynamic image transformation: a 150&#215;100 face-detection-based thumbnail of the uploaded image.<\/p>\n<p><cld-code-widget\n      class=\" c-code-widget\"\n      snippets=\"[{&quot;sdkId&quot;:&quot;nodejs&quot;,&quot;framework&quot;:&quot;nodejs&quot;,&quot;language&quot;:&quot;nodejs&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.image(\\&quot;user_sample_image_1001.jpg\\&quot;, {height: 100, gravity: \\&quot;face\\&quot;, width: 150, crop: \\&quot;thumb\\&quot;})&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.image(\\&quot;user_sample_image_1001.jpg\\&quot;, {height: 100, gravity: \\&quot;face\\&quot;, width: 150, crop: \\&quot;thumb\\&quot;})&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Node.js&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;},{&quot;sdkId&quot;:&quot;react_2&quot;,&quot;framework&quot;:&quot;react_2&quot;,&quot;language&quot;:&quot;react&quot;,&quot;rawCodeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;user_sample_image_1001.jpg\\&quot;).resize(\\n  thumbnail()\\n    .width(150)\\n    .height(100)\\n    .gravity(focusOn(face()))\\n);&quot;,&quot;codeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;user_sample_image_1001.jpg\\&quot;).resize(\\n  thumbnail()\\n    .width(150)\\n    .height(100)\\n    .gravity(focusOn(face()))\\n);&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;React&quot;,&quot;packageName&quot;:&quot;@cloudinary\\\/react&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;react&quot;,&quot;framework&quot;:&quot;react&quot;,&quot;language&quot;:&quot;react&quot;,&quot;rawCodeSnippet&quot;:&quot;&lt;Image publicId=\\&quot;user_sample_image_1001.jpg\\&quot; &gt; &lt;Transformation height=\\&quot;100\\&quot; gravity=\\&quot;face\\&quot; width=\\&quot;150\\&quot; crop=\\&quot;thumb\\&quot; \\\/&gt; &lt;\\\/Image&gt;&quot;,&quot;codeSnippet&quot;:&quot;&lt;Image publicId=\\&quot;user_sample_image_1001.jpg\\&quot; &gt;\\n\\t&lt;Transformation height=\\&quot;100\\&quot; gravity=\\&quot;face\\&quot; width=\\&quot;150\\&quot; crop=\\&quot;thumb\\&quot; \\\/&gt;\\n&lt;\\\/Image&gt;&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;React&quot;,&quot;packageName&quot;:&quot;cloudinary-react&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;vue_2&quot;,&quot;framework&quot;:&quot;vue_2&quot;,&quot;language&quot;:&quot;vue&quot;,&quot;rawCodeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;user_sample_image_1001.jpg\\&quot;).resize(\\n  thumbnail()\\n    .width(150)\\n    .height(100)\\n    .gravity(focusOn(face()))\\n);&quot;,&quot;codeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;user_sample_image_1001.jpg\\&quot;).resize(\\n  thumbnail()\\n    .width(150)\\n    .height(100)\\n    .gravity(focusOn(face()))\\n);&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Vue.js&quot;,&quot;packageName&quot;:&quot;@cloudinary\\\/vue&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;vue&quot;,&quot;framework&quot;:&quot;vue&quot;,&quot;language&quot;:&quot;vue&quot;,&quot;rawCodeSnippet&quot;:&quot;&lt;cld-image public-id=\\&quot;user_sample_image_1001.jpg\\&quot; &gt; &lt;cld-transformation height=\\&quot;100\\&quot; gravity=\\&quot;face\\&quot; width=\\&quot;150\\&quot; crop=\\&quot;thumb\\&quot; \\\/&gt; &lt;\\\/cld-image&gt;&quot;,&quot;codeSnippet&quot;:&quot;&lt;cld-image public-id=\\&quot;user_sample_image_1001.jpg\\&quot; &gt;\\n\\t&lt;cld-transformation height=\\&quot;100\\&quot; gravity=\\&quot;face\\&quot; width=\\&quot;150\\&quot; crop=\\&quot;thumb\\&quot; \\\/&gt;\\n&lt;\\\/cld-image&gt;&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Vue.js&quot;,&quot;packageName&quot;:&quot;cloudinary-vue&quot;,&quot;packageStatus&quot;:&quot;legacy&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;angular_2&quot;,&quot;framework&quot;:&quot;angular_2&quot;,&quot;language&quot;:&quot;angular&quot;,&quot;rawCodeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;user_sample_image_1001.jpg\\&quot;).resize(\\n  thumbnail()\\n    .width(150)\\n    .height(100)\\n    .gravity(focusOn(face()))\\n);&quot;,&quot;codeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;user_sample_image_1001.jpg\\&quot;).resize(\\n  thumbnail()\\n    .width(150)\\n    .height(100)\\n    .gravity(focusOn(face()))\\n);&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Angular&quot;,&quot;packageName&quot;:&quot;@cloudinary\\\/ng&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;angular&quot;,&quot;framework&quot;:&quot;angular&quot;,&quot;language&quot;:&quot;angular&quot;,&quot;rawCodeSnippet&quot;:&quot;&lt;cl-image public-id=\\&quot;user_sample_image_1001.jpg\\&quot; &gt; &lt;cl-transformation height=\\&quot;100\\&quot; gravity=\\&quot;face\\&quot; width=\\&quot;150\\&quot; crop=\\&quot;thumb\\&quot;&gt; &lt;\\\/cl-transformation&gt; &lt;\\\/cl-image&gt;&quot;,&quot;codeSnippet&quot;:&quot;&lt;cl-image public-id=\\&quot;user_sample_image_1001.jpg\\&quot; &gt;\\n\\t&lt;cl-transformation height=\\&quot;100\\&quot; gravity=\\&quot;face\\&quot; width=\\&quot;150\\&quot; crop=\\&quot;thumb\\&quot;&gt;\\n\\t&lt;\\\/cl-transformation&gt;\\n&lt;\\\/cl-image&gt;&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Angular&quot;,&quot;packageName&quot;:&quot;@cloudinary\\\/angular-5.x&quot;,&quot;packageStatus&quot;:&quot;legacy&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;js_2&quot;,&quot;framework&quot;:&quot;js_2&quot;,&quot;language&quot;:&quot;js&quot;,&quot;rawCodeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;user_sample_image_1001.jpg\\&quot;).resize(\\n  thumbnail()\\n    .width(150)\\n    .height(100)\\n    .gravity(focusOn(face()))\\n);&quot;,&quot;codeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;user_sample_image_1001.jpg\\&quot;).resize(\\n  thumbnail()\\n    .width(150)\\n    .height(100)\\n    .gravity(focusOn(face()))\\n);&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;JS&quot;,&quot;packageName&quot;:&quot;@cloudinary\\\/url-gen&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;js&quot;,&quot;framework&quot;:&quot;js&quot;,&quot;language&quot;:&quot;js&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.imageTag(&#039;user_sample_image_1001.jpg&#039;, {height: 100, gravity: \\&quot;face\\&quot;, width: 150, crop: \\&quot;thumb\\&quot;}).toHtml();&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.imageTag(&#039;user_sample_image_1001.jpg&#039;, {height: 100, gravity: \\&quot;face\\&quot;, width: 150, crop: \\&quot;thumb\\&quot;}).toHtml();&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;JS&quot;,&quot;packageName&quot;:&quot;cloudinary-core&quot;,&quot;packageStatus&quot;:&quot;legacy&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;},{&quot;sdkId&quot;:&quot;python&quot;,&quot;framework&quot;:&quot;python&quot;,&quot;language&quot;:&quot;python&quot;,&quot;rawCodeSnippet&quot;:&quot;CloudinaryImage(\\&quot;user_sample_image_1001.jpg\\&quot;).image(height=100, gravity=\\&quot;face\\&quot;, width=150, crop=\\&quot;thumb\\&quot;)&quot;,&quot;codeSnippet&quot;:&quot;CloudinaryImage(\\&quot;user_sample_image_1001.jpg\\&quot;).image(height=100, gravity=\\&quot;face\\&quot;, width=150, crop=\\&quot;thumb\\&quot;)&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Python&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;php_2&quot;,&quot;framework&quot;:&quot;php_2&quot;,&quot;language&quot;:&quot;php&quot;,&quot;rawCodeSnippet&quot;:&quot;(new ImageTag(&#039;user_sample_image_1001.jpg&#039;))\\n\\t-&gt;resize(Resize::thumbnail()-&gt;width(150)\\n-&gt;height(100)\\n\\t-&gt;gravity(\\n\\tGravity::focusOn(\\n\\tFocusOn::face()))\\n\\t);&quot;,&quot;codeSnippet&quot;:&quot;(new ImageTag(&#039;user_sample_image_1001.jpg&#039;))\\n\\t-&gt;resize(Resize::thumbnail()-&gt;width(150)\\n-&gt;height(100)\\n\\t-&gt;gravity(\\n\\tGravity::focusOn(\\n\\tFocusOn::face()))\\n\\t);&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;PHP&quot;,&quot;packageName&quot;:&quot;cloudinary_php&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;3.x&quot;},{&quot;sdkId&quot;:&quot;php&quot;,&quot;framework&quot;:&quot;php&quot;,&quot;language&quot;:&quot;php&quot;,&quot;rawCodeSnippet&quot;:&quot;cl_image_tag(\\&quot;user_sample_image_1001.jpg\\&quot;, array(\\&quot;height\\&quot;=&gt;100, \\&quot;gravity\\&quot;=&gt;\\&quot;face\\&quot;, \\&quot;width\\&quot;=&gt;150, \\&quot;crop\\&quot;=&gt;\\&quot;thumb\\&quot;))&quot;,&quot;codeSnippet&quot;:&quot;cl_image_tag(\\&quot;user_sample_image_1001.jpg\\&quot;, array(\\&quot;height\\&quot;=&gt;100, \\&quot;gravity\\&quot;=&gt;\\&quot;face\\&quot;, \\&quot;width\\&quot;=&gt;150, \\&quot;crop\\&quot;=&gt;\\&quot;thumb\\&quot;))&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;PHP&quot;,&quot;packageName&quot;:&quot;cloudinary_php&quot;,&quot;packageStatus&quot;:&quot;legacy&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;java&quot;,&quot;framework&quot;:&quot;java&quot;,&quot;language&quot;:&quot;java&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.url().transformation(new Transformation().height(100).gravity(\\&quot;face\\&quot;).width(150).crop(\\&quot;thumb\\&quot;)).imageTag(\\&quot;user_sample_image_1001.jpg\\&quot;);&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.url().transformation(new Transformation().height(100).gravity(\\&quot;face\\&quot;).width(150).crop(\\&quot;thumb\\&quot;)).imageTag(\\&quot;user_sample_image_1001.jpg\\&quot;);&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Java&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;},{&quot;sdkId&quot;:&quot;ruby&quot;,&quot;framework&quot;:&quot;ruby&quot;,&quot;language&quot;:&quot;ruby&quot;,&quot;rawCodeSnippet&quot;:&quot;cl_image_tag(\\&quot;user_sample_image_1001.jpg\\&quot;, height: 100, gravity: \\&quot;face\\&quot;, width: 150, crop: \\&quot;thumb\\&quot;)&quot;,&quot;codeSnippet&quot;:&quot;cl_image_tag(\\&quot;user_sample_image_1001.jpg\\&quot;, height: 100, gravity: \\&quot;face\\&quot;, width: 150, crop: \\&quot;thumb\\&quot;)&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Ruby&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;},{&quot;sdkId&quot;:&quot;csharp&quot;,&quot;framework&quot;:&quot;csharp&quot;,&quot;language&quot;:&quot;csharp&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.Api.UrlImgUp.Transform(new Transformation().Height(100).Gravity(\\&quot;face\\&quot;).Width(150).Crop(\\&quot;thumb\\&quot;)).BuildImageTag(\\&quot;user_sample_image_1001.jpg\\&quot;)&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.Api.UrlImgUp.Transform(new Transformation().Height(100).Gravity(\\&quot;face\\&quot;).Width(150).Crop(\\&quot;thumb\\&quot;)).BuildImageTag(\\&quot;user_sample_image_1001.jpg\\&quot;)&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;.NET&quot;,&quot;packageName&quot;:&quot;CloudinaryDotNet&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;dart&quot;,&quot;framework&quot;:&quot;dart&quot;,&quot;language&quot;:&quot;dart&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.image(&#039;user_sample_image_1001.jpg&#039;).transformation(Transformation()\\n\\t.resize(Resize.thumbnail().width(150)\\n.height(100)\\n\\t.gravity(\\n\\tGravity.focusOn(\\n\\tFocusOn.face()))\\n\\t));&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.image(&#039;user_sample_image_1001.jpg&#039;).transformation(Transformation()\\n\\t.resize(Resize.thumbnail().width(150)\\n.height(100)\\n\\t.gravity(\\n\\tGravity.focusOn(\\n\\tFocusOn.face()))\\n\\t));&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Dart&quot;,&quot;packageName&quot;:&quot;cloudinary_dart&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;swift&quot;,&quot;framework&quot;:&quot;swift&quot;,&quot;language&quot;:&quot;swift&quot;,&quot;rawCodeSnippet&quot;:&quot;imageView.cldSetImage(cloudinary.createUrl().setTransformation(CLDTransformation().setHeight(100).setGravity(\\&quot;face\\&quot;).setWidth(150).setCrop(\\&quot;thumb\\&quot;)).generate(\\&quot;user_sample_image_1001.jpg\\&quot;)!, cloudinary: cloudinary)&quot;,&quot;codeSnippet&quot;:&quot;imageView.cldSetImage(cloudinary.createUrl().setTransformation(CLDTransformation().setHeight(100).setGravity(\\&quot;face\\&quot;).setWidth(150).setCrop(\\&quot;thumb\\&quot;)).generate(\\&quot;user_sample_image_1001.jpg\\&quot;)!, cloudinary: cloudinary)&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;iOS&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;5.x&quot;},{&quot;sdkId&quot;:&quot;android&quot;,&quot;framework&quot;:&quot;android&quot;,&quot;language&quot;:&quot;android&quot;,&quot;rawCodeSnippet&quot;:&quot;MediaManager.get().url().transformation(new Transformation().height(100).gravity(\\&quot;face\\&quot;).width(150).crop(\\&quot;thumb\\&quot;)).generate(\\&quot;user_sample_image_1001.jpg\\&quot;);&quot;,&quot;codeSnippet&quot;:&quot;MediaManager.get().url().transformation(new Transformation().height(100).gravity(\\&quot;face\\&quot;).width(150).crop(\\&quot;thumb\\&quot;)).generate(\\&quot;user_sample_image_1001.jpg\\&quot;);&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Android&quot;,&quot;packageName&quot;:&quot;cloudinary-android&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;3.x&quot;},{&quot;sdkId&quot;:&quot;flutter&quot;,&quot;framework&quot;:&quot;flutter&quot;,&quot;language&quot;:&quot;flutter&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.image(&#039;user_sample_image_1001.jpg&#039;).transformation(Transformation()\\n\\t.resize(Resize.thumbnail().width(150)\\n.height(100)\\n\\t.gravity(\\n\\tGravity.focusOn(\\n\\tFocusOn.face()))\\n\\t));&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.image(&#039;user_sample_image_1001.jpg&#039;).transformation(Transformation()\\n\\t.resize(Resize.thumbnail().width(150)\\n.height(100)\\n\\t.gravity(\\n\\tGravity.focusOn(\\n\\tFocusOn.face()))\\n\\t));&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Flutter&quot;,&quot;packageName&quot;:&quot;cloudinary_flutter&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;kotlin&quot;,&quot;framework&quot;:&quot;kotlin&quot;,&quot;language&quot;:&quot;kotlin&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.image {\\n\\tpublicId(\\&quot;user_sample_image_1001.jpg\\&quot;)\\n\\t resize(Resize.thumbnail() { width(150)\\n height(100)\\n\\t gravity(\\n\\tGravity.focusOn(\\n\\tFocusOn.face()))\\n\\t }) \\n}.generate()&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.image {\\n\\tpublicId(\\&quot;user_sample_image_1001.jpg\\&quot;)\\n\\t resize(Resize.thumbnail() { width(150)\\n height(100)\\n\\t gravity(\\n\\tGravity.focusOn(\\n\\tFocusOn.face()))\\n\\t }) \\n}.generate()&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Kotlin&quot;,&quot;packageName&quot;:&quot;kotlin-url-gen&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;jquery&quot;,&quot;framework&quot;:&quot;jquery&quot;,&quot;language&quot;:&quot;jquery&quot;,&quot;rawCodeSnippet&quot;:&quot;$.cloudinary.image(\\&quot;user_sample_image_1001.jpg\\&quot;, {height: 100, gravity: \\&quot;face\\&quot;, width: 150, crop: \\&quot;thumb\\&quot;})&quot;,&quot;codeSnippet&quot;:&quot;$.cloudinary.image(\\&quot;user_sample_image_1001.jpg\\&quot;, {height: 100, gravity: \\&quot;face\\&quot;, width: 150, crop: \\&quot;thumb\\&quot;})&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;jQuery&quot;,&quot;packageName&quot;:&quot;cloudinary-jquery&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;},{&quot;sdkId&quot;:&quot;react_native&quot;,&quot;framework&quot;:&quot;react_native&quot;,&quot;language&quot;:&quot;react_native&quot;,&quot;rawCodeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;user_sample_image_1001.jpg\\&quot;).resize(\\n  thumbnail()\\n    .width(150)\\n    .height(100)\\n    .gravity(focusOn(face()))\\n);&quot;,&quot;codeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;user_sample_image_1001.jpg\\&quot;).resize(\\n  thumbnail()\\n    .width(150)\\n    .height(100)\\n    .gravity(focusOn(face()))\\n);&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;React Native&quot;,&quot;packageName&quot;:&quot;cloudinary-react-native&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;}]\"\n      parsed-url=\"{&quot;url&quot;:&quot;https:\\\/\\\/res.cloudinary.com\\\/demo\\\/image\\\/upload\\\/c_thumb,h_100,g_face,w_150\\\/user_sample_image_1001.jpg&quot;,&quot;cloud_name&quot;:&quot;demo&quot;,&quot;host&quot;:&quot;res.cloudinary.com&quot;,&quot;type&quot;:&quot;upload&quot;,&quot;resource_type&quot;:&quot;image&quot;,&quot;transformation&quot;:[{&quot;crop_mode&quot;:&quot;thumb&quot;,&quot;height&quot;:&quot;100&quot;,&quot;gravity&quot;:&quot;face&quot;,&quot;width&quot;:&quot;150&quot;}],&quot;transformation_string&quot;:&quot;c_thumb,h_100,g_face,w_150&quot;,&quot;url_suffix&quot;:&quot;&quot;,&quot;version&quot;:&quot;&quot;,&quot;secure&quot;:true,&quot;public_id&quot;:&quot;user_sample_image_1001.jpg&quot;,&quot;extension&quot;:&quot;jpg&quot;,&quot;format&quot;:&quot;jpg&quot;,&quot;format_code&quot;:true,&quot;url_code&quot;:false,&quot;signature&quot;:&quot;&quot;,&quot;private_cdn&quot;:false,&quot;result_asset_type&quot;:&quot;image&quot;}\"\n      with-url=\"true\"\n    >\n      <span class=\"u-visually-hidden\">Loading code examples<\/span>\n    <\/cld-code-widget><a class=\"c-image-link\" href=\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/c_thumb,h_100,g_face,w_150\/user_sample_image_1001.jpg\" target=\"_blank\"><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/c_thumb,h_100,g_face,w_150\/user_sample_image_1001.jpg\" alt=\"Face detection based thumbnail\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"150\" height=\"100\"\/><\/a><\/p>\n<h2>Direct uploading from the browser using jQuery<\/h2>\n<p>Cloudinary\u2019s jQuery plugin allows you to easily add an upload control to your web site, which allows to directly upload an image from their browsers to the cloud. Now you can use dynamic Javascript code to add direct upload controls to your rich client-side web application.<\/p>\n<p>First, include Cloudinary\u2019s <a href=\"https:\/\/github.com\/cloudinary\/cloudinary_js\">jQuery plugin<\/a> and all dependent Javascript files (if you use our server-side client libraries for rendering your pages, there are helper methods for including all required JS files).<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span> <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">'jquery.min.js'<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">'text\/javascript'<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span> <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">'jquery.ui.widget.js'<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">'text\/javascript'<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span> <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">'jquery.iframe-transport.js'<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">'text\/javascript'<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span> <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">'jquery.fileupload.js'<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">'text\/javascript'<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span> <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">'jquery.cloudinary.js'<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">'text\/javascript'<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>Now you can use the <code>unsigned_upload_tag<\/code> method to create a new tag specifying an unsigned direct upload. You need to specify the cloud name of your Cloudinary account and the unique name of an unsigned upload preset defined in your account.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">$(<span class=\"hljs-string\">'.upload_form'<\/span>).append($.cloudinary.unsigned_upload_tag(<span class=\"hljs-string\">\"zcudy0uz\"<\/span>, \n  { <span class=\"hljs-attr\">cloud_name<\/span>: <span class=\"hljs-string\">'demo'<\/span> }));\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>Direct uploading is initiated automatically after a file is selected or dragged. An input field is automatically added to your form with the identifier of the uploaded image for referencing in your model.<\/p>\n<p>Further upload options can be specified, and you can bind to upload progress and completion events, to update your application and UI accordingly. In addition, you can transform an existing input file field into an unsigned direct upload widget.<\/p>\n<p><strong>Update (08\/17)<\/strong>: Make sure your input field includes the name=\u201cfile\u201d and type=\u201cfile\u201d attributes.<\/p>\n<p>The following sample Javascript code demonstrates these options. When an \u2018upload completed\u2019 call is received, it dynamically adds an image tag to the page, with a dynamically-generated 150&#215;100 face-detection based thumbnail of the uploaded image, while applying a saturation increase effect.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">$(<span class=\"hljs-string\">'.upload_field'<\/span>).unsigned_cloudinary_upload(<span class=\"hljs-string\">\"zcudy0uz\"<\/span>, \n  { <span class=\"hljs-attr\">cloud_name<\/span>: <span class=\"hljs-string\">'demo'<\/span>, <span class=\"hljs-attr\">tags<\/span>: <span class=\"hljs-string\">'browser_uploads'<\/span> }, \n  { <span class=\"hljs-attr\">multiple<\/span>: <span class=\"hljs-literal\">true<\/span> }\n).bind(<span class=\"hljs-string\">'cloudinarydone'<\/span>, <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span>(<span class=\"hljs-params\">e, data<\/span>) <\/span>{\n\n  $(<span class=\"hljs-string\">'.thumbnails'<\/span>).append($.cloudinary.image(data.result.public_id, \n    { <span class=\"hljs-attr\">format<\/span>: <span class=\"hljs-string\">'jpg'<\/span>, <span class=\"hljs-attr\">width<\/span>: <span class=\"hljs-number\">150<\/span>, <span class=\"hljs-attr\">height<\/span>: <span class=\"hljs-number\">100<\/span>, \n     \u00a0<span class=\"hljs-attr\">crop<\/span>: <span class=\"hljs-string\">'thumb'<\/span>, <span class=\"hljs-attr\">gravity<\/span>: <span class=\"hljs-string\">'face'<\/span>, <span class=\"hljs-attr\">effect<\/span>: <span class=\"hljs-string\">'saturation:50'<\/span> } ))}\n\n).bind(<span class=\"hljs-string\">'cloudinaryprogress'<\/span>, <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span>(<span class=\"hljs-params\">e, data<\/span>) <\/span>{ \n\n  $(<span class=\"hljs-string\">'.progress_bar'<\/span>).css(<span class=\"hljs-string\">'width'<\/span>, \n    <span class=\"hljs-built_in\">Math<\/span>.round((data.loaded * <span class=\"hljs-number\">100.0<\/span>) \/ data.total) + <span class=\"hljs-string\">'%'<\/span>); \n\n});\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>Direct uploading from the browser uses modern cross-origin resource sharing (CORS) methods. In order to support old Internet Explorer browsers, you should place <a href=\"https:\/\/github.com\/cloudinary\/cloudinary_js\/blob\/master\/html\/cloudinary_cors.html\">cloudinary_cors.html<\/a> in the root of your web application (or set the <code>callback<\/code> upload parameter to the correct relative path or URL of this file in your web site).<\/p>\n<h2>Server-side upload tag rendering<\/h2>\n<p>When we introduced signed direct uploading from the browser a while ago, we added view helper methods for rendering direct <a href=\"https:\/\/cloudinary.com\/documentation\/upload_widget\">file upload<\/a> input fields from the server-side code of your favorite development frameworks.<\/p>\n<p>If your web pages are rendered on the server-side and you still wish to support unsigned uploads, you can use the following new view helper methods for Ruby on Rails, PHP, Java and Node.js:<\/p>\n<cld-code-widget\n      class=\" c-code-widget\"\n      snippets=\"[{&quot;sdkId&quot;:&quot;ruby&quot;,&quot;framework&quot;:&quot;ruby&quot;,&quot;language&quot;:&quot;ruby&quot;,&quot;displayName&quot;:&quot;Ruby&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;rawCodeSnippet&quot;:&quot;cl_unsigned_image_upload_tag(:photo, \\&quot;zcudy0uz\\&quot;, :cloud_name =&gt; \\&quot;demo\\&quot;, \\n  :tags =&gt; \\&quot;test_upload\\&quot;)&quot;,&quot;codeSnippet&quot;:&quot;cl_unsigned_image_upload_tag(:photo, \\&quot;zcudy0uz\\&quot;, :cloud_name =&gt; \\&quot;demo\\&quot;, \\n  :tags =&gt; \\&quot;test_upload\\&quot;)&quot;},{&quot;sdkId&quot;:&quot;php&quot;,&quot;framework&quot;:&quot;php&quot;,&quot;language&quot;:&quot;php&quot;,&quot;displayName&quot;:&quot;PHP&quot;,&quot;packageName&quot;:&quot;cloudinary_php&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;,&quot;packageStatus&quot;:&quot;legacy&quot;,&quot;rawCodeSnippet&quot;:&quot;&lt;?php echo cl_unsigned_image_upload_tag(&#039;zcudy0uz&#039;, \\n    $upload_preset, array(\\&quot;cloud_name\\&quot; =&gt; \\&quot;demo\\&quot;, \\&quot;tags\\&quot; =&gt; \\&quot;test_upload\\&quot;)); ?&gt;&quot;,&quot;codeSnippet&quot;:&quot;&lt;?php echo cl_unsigned_image_upload_tag(&#039;zcudy0uz&#039;, \\n    $upload_preset, array(\\&quot;cloud_name\\&quot; =&gt; \\&quot;demo\\&quot;, \\&quot;tags\\&quot; =&gt; \\&quot;test_upload\\&quot;)); ?&gt;&quot;},{&quot;sdkId&quot;:&quot;nodejs&quot;,&quot;framework&quot;:&quot;nodejs&quot;,&quot;language&quot;:&quot;javascript&quot;,&quot;displayName&quot;:&quot;Node.js&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.uploader.unsigned_image_upload_tag(&#039;photo&#039;, &#039;zcudy0uz&#039;, \\n  { cloud_name: &#039;demo&#039;, tags: &#039;test_upload&#039; });&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.uploader.unsigned_image_upload_tag(&#039;photo&#039;, &#039;zcudy0uz&#039;, \\n  { cloud_name: &#039;demo&#039;, tags: &#039;test_upload&#039; });&quot;},{&quot;sdkId&quot;:&quot;java&quot;,&quot;framework&quot;:&quot;java&quot;,&quot;language&quot;:&quot;java&quot;,&quot;displayName&quot;:&quot;Java&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.uploader().unsignedImageUploadTag(\\&quot;image_id\\&quot;, \\u201czcudy0uz\\u201d, \\n  Cloudinary.asMap(\\&quot;tags\\&quot;, \\&quot;test_upload\\&quot;), Map&lt;String, Object&gt; htmlOptions);\\n  \\ncloudinary.uploader().imageUploadTag(\\&quot;image_id\\&quot;, options, htmlOptions);&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.uploader().unsignedImageUploadTag(\\&quot;image_id\\&quot;, \\u201czcudy0uz\\u201d, \\n  Cloudinary.asMap(\\&quot;tags\\&quot;, \\&quot;test_upload\\&quot;), Map&lt;String, Object&gt; htmlOptions);\\n  \\ncloudinary.uploader().imageUploadTag(\\&quot;image_id\\&quot;, options, htmlOptions);&quot;}]\"\n      parsed-url=\"[]\"\n      with-url=\"false\"\n    >\n      <span class=\"u-visually-hidden\">Loading code examples<\/span>\n    <\/cld-code-widget>\n<h2>Sample client-side web projects<\/h2>\n<p>We\u2019ve updated the sample projects of Cloudinary\u2019s client libraries (<a href=\"https:\/\/github.com\/cloudinary\/cloudinary_gem\/tree\/master\/samples\">Ruby on Rails<\/a>, <a href=\"https:\/\/github.com\/cloudinary\/cloudinary_php\/tree\/master\/samples\">PHP<\/a>, \u00a0<a href=\"https:\/\/github.com\/cloudinary\/cloudinary-django-sample\">Django<\/a>, <a href=\"https:\/\/github.com\/cloudinary\/cloudinary_java\/tree\/master\/samples\/photo_album\">Java<\/a>) to demonstrate unsigned direct uploading with <a href=\"https:\/\/cloudinary.com\/glossary\/server-side-rendering\">server-side rendering<\/a> of the initial upload control.<\/p>\n<p>In addition, to demonstrate direct unsigned uploading in client-side-only apps, we\u2019ve build a sample photo album project in <strong>AngularJS<\/strong>. Our project uses the jQuery plugin to perform direct uploading to Cloudinary, and then uses Cloudinary to list uploaded images, further transform images, and deliver them via a fast CDN.<\/p>\n<h2>Summary<\/h2>\n<p>Direct uploading to the cloud from a browser or mobile app is very powerful. Unsigned uploading makes this much simpler to use in modern apps, while security measures are taken to detect and prevent abuse attempts.<\/p>\n<p>This means that Cloudinary takes care of the entire image management flow &#8211; simply call the upload API from your mobile app, or include a single jQuery line in your web app, and images are uploaded directly to Cloudinary. No need for a server-side component at all, you can control upload options using presets from a centralized location, and then dynamically transform your images and deliver them from a fast CDN, using nothing but client-side code.<\/p>\n<p>Direct uploading from the browser is one of Cloudinary\u2019s most popular features. However, the need to generate server-side signature made usage a bit more complex, especially for modern, dynamic, client-side apps. With our new unsigned upload support, and the new utility methods of the jQuery plugin and other frameworks, we believe direct upload has become much simpler, and you should definitely try it out. Any feedback will be appreciated!<\/p>\n<hr \/>\n<h2>Further Reading on File Upload<\/h2>\n<ul>\n<li>\n<a href=\"https:\/\/cloudinary.com\/blog\/automating_file_upload_and_sharing\">File upload and storage<\/a> with Cloudinary<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/documentation\/upload_images\">Image Upload &#8211; Image Management for Developers<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/documentation\/upload_widget\">Cloudinary\u2019s upload widget<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/blog\/file_upload_with_php\">PHP file upload<\/a> with Cloudinary<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/blog\/file_upload_with_ajax\">AJAX file upload<\/a> &#8211; Quick tutorial &amp; time saving Tips<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/blog\/impressed_by_whatsapp_technology_build_a_whatsapp_clone_with_image_and_video_upload\">Android file upload<\/a> &#8211; Clone WhatsApp technology using Cloudinary<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/blog\/how_to_build_a_real_time_photo_sharing_website_in_a_few_easy_steps\">Build a real-time photo sharing website<\/a> in a few easy steps<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/blog\/direct_image_uploads_from_the_browser_to_the_cloud_with_jquery\">jQuery image upload<\/a> plugin<\/li>\n<\/ul>\n<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":41,"featured_media":21246,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[333,25,119,174,176,214,257],"class_list":["post-21245","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-android","tag-asset-management","tag-file-upload","tag-ios","tag-java","tag-node","tag-ruby-on-rails"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.6 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Direct Image Upload From Browser or Mobile App to the Cloud<\/title>\n<meta name=\"description\" content=\"How to enable client-side direct image upload from the browser or mobile app to the cloud, while completely bypassing your server.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cloudinary.com\/blog\/direct_upload_made_easy_from_browser_or_mobile_app_to_the_cloud\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Direct Image Upload Made Easy, From Browser or Mobile App to the Cloud\" \/>\n<meta property=\"og:description\" content=\"How to enable client-side direct image upload from the browser or mobile app to the cloud, while completely bypassing your server.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/direct_upload_made_easy_from_browser_or_mobile_app_to_the_cloud\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2014-07-16T13:45:30+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-02-21T23:55:31+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1649722544\/Web_Assets\/blog\/11_direct_img_upload\/11_direct_img_upload-jpg?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"1540\" \/>\n\t<meta property=\"og:image:height\" content=\"847\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"NewsArticle\",\"@id\":\"https:\/\/cloudinary.com\/blog\/direct_upload_made_easy_from_browser_or_mobile_app_to_the_cloud#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/direct_upload_made_easy_from_browser_or_mobile_app_to_the_cloud\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Direct Image Upload Made Easy, From Browser or Mobile App to the Cloud\",\"datePublished\":\"2014-07-16T13:45:30+00:00\",\"dateModified\":\"2025-02-21T23:55:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/direct_upload_made_easy_from_browser_or_mobile_app_to_the_cloud\"},\"wordCount\":13,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/direct_upload_made_easy_from_browser_or_mobile_app_to_the_cloud#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649722544\/Web_Assets\/blog\/11_direct_img_upload\/11_direct_img_upload.jpg?_i=AA\",\"keywords\":[\"Android\",\"Asset Management\",\"File-upload\",\"iOS\",\"Java\",\"Node\",\"Ruby on Rails\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2014\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/direct_upload_made_easy_from_browser_or_mobile_app_to_the_cloud\",\"url\":\"https:\/\/cloudinary.com\/blog\/direct_upload_made_easy_from_browser_or_mobile_app_to_the_cloud\",\"name\":\"Direct Image Upload From Browser or Mobile App to the Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/direct_upload_made_easy_from_browser_or_mobile_app_to_the_cloud#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/direct_upload_made_easy_from_browser_or_mobile_app_to_the_cloud#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649722544\/Web_Assets\/blog\/11_direct_img_upload\/11_direct_img_upload.jpg?_i=AA\",\"datePublished\":\"2014-07-16T13:45:30+00:00\",\"dateModified\":\"2025-02-21T23:55:31+00:00\",\"description\":\"How to enable client-side direct image upload from the browser or mobile app to the cloud, while completely bypassing your server.\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/direct_upload_made_easy_from_browser_or_mobile_app_to_the_cloud#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/direct_upload_made_easy_from_browser_or_mobile_app_to_the_cloud\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/direct_upload_made_easy_from_browser_or_mobile_app_to_the_cloud#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649722544\/Web_Assets\/blog\/11_direct_img_upload\/11_direct_img_upload.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649722544\/Web_Assets\/blog\/11_direct_img_upload\/11_direct_img_upload.jpg?_i=AA\",\"width\":1540,\"height\":847},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/direct_upload_made_easy_from_browser_or_mobile_app_to_the_cloud#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Direct Image Upload Made Easy, From Browser or Mobile App to the Cloud\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"name\":\"Cloudinary Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cloudinary.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\",\"name\":\"Cloudinary Blog\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"width\":312,\"height\":60,\"caption\":\"Cloudinary Blog\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Direct Image Upload From Browser or Mobile App to the Cloud","description":"How to enable client-side direct image upload from the browser or mobile app to the cloud, while completely bypassing your server.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/cloudinary.com\/blog\/direct_upload_made_easy_from_browser_or_mobile_app_to_the_cloud","og_locale":"en_US","og_type":"article","og_title":"Direct Image Upload Made Easy, From Browser or Mobile App to the Cloud","og_description":"How to enable client-side direct image upload from the browser or mobile app to the cloud, while completely bypassing your server.","og_url":"https:\/\/cloudinary.com\/blog\/direct_upload_made_easy_from_browser_or_mobile_app_to_the_cloud","og_site_name":"Cloudinary Blog","article_published_time":"2014-07-16T13:45:30+00:00","article_modified_time":"2025-02-21T23:55:31+00:00","og_image":[{"width":1540,"height":847,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1649722544\/Web_Assets\/blog\/11_direct_img_upload\/11_direct_img_upload-jpg?_i=AA","type":"image\/jpeg"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/direct_upload_made_easy_from_browser_or_mobile_app_to_the_cloud#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/direct_upload_made_easy_from_browser_or_mobile_app_to_the_cloud"},"author":{"name":"","@id":""},"headline":"Direct Image Upload Made Easy, From Browser or Mobile App to the Cloud","datePublished":"2014-07-16T13:45:30+00:00","dateModified":"2025-02-21T23:55:31+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/direct_upload_made_easy_from_browser_or_mobile_app_to_the_cloud"},"wordCount":13,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/direct_upload_made_easy_from_browser_or_mobile_app_to_the_cloud#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649722544\/Web_Assets\/blog\/11_direct_img_upload\/11_direct_img_upload.jpg?_i=AA","keywords":["Android","Asset Management","File-upload","iOS","Java","Node","Ruby on Rails"],"inLanguage":"en-US","copyrightYear":"2014","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/direct_upload_made_easy_from_browser_or_mobile_app_to_the_cloud","url":"https:\/\/cloudinary.com\/blog\/direct_upload_made_easy_from_browser_or_mobile_app_to_the_cloud","name":"Direct Image Upload From Browser or Mobile App to the Cloud","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/direct_upload_made_easy_from_browser_or_mobile_app_to_the_cloud#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/direct_upload_made_easy_from_browser_or_mobile_app_to_the_cloud#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649722544\/Web_Assets\/blog\/11_direct_img_upload\/11_direct_img_upload.jpg?_i=AA","datePublished":"2014-07-16T13:45:30+00:00","dateModified":"2025-02-21T23:55:31+00:00","description":"How to enable client-side direct image upload from the browser or mobile app to the cloud, while completely bypassing your server.","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/direct_upload_made_easy_from_browser_or_mobile_app_to_the_cloud#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/direct_upload_made_easy_from_browser_or_mobile_app_to_the_cloud"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/direct_upload_made_easy_from_browser_or_mobile_app_to_the_cloud#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649722544\/Web_Assets\/blog\/11_direct_img_upload\/11_direct_img_upload.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649722544\/Web_Assets\/blog\/11_direct_img_upload\/11_direct_img_upload.jpg?_i=AA","width":1540,"height":847},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/direct_upload_made_easy_from_browser_or_mobile_app_to_the_cloud#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Direct Image Upload Made Easy, From Browser or Mobile App to the Cloud"}]},{"@type":"WebSite","@id":"https:\/\/cloudinary.com\/blog\/#website","url":"https:\/\/cloudinary.com\/blog\/","name":"Cloudinary Blog","description":"","publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cloudinary.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/cloudinary.com\/blog\/#organization","name":"Cloudinary Blog","url":"https:\/\/cloudinary.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","width":312,"height":60,"caption":"Cloudinary Blog"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":""}]}},"jetpack_featured_media_url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649722544\/Web_Assets\/blog\/11_direct_img_upload\/11_direct_img_upload.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21245","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/users\/41"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/comments?post=21245"}],"version-history":[{"count":5,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21245\/revisions"}],"predecessor-version":[{"id":36927,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21245\/revisions\/36927"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/21246"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=21245"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=21245"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=21245"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}