{"id":28171,"date":"2022-03-23T22:25:10","date_gmt":"2022-03-23T22:25:10","guid":{"rendered":"http:\/\/Handling-Robust-Video-Uploads-in-Gatsby.js"},"modified":"2022-03-23T22:25:10","modified_gmt":"2022-03-23T22:25:10","slug":"handling-robust-video-uploads-in-gatsby-js","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/guest_post\/handling-robust-video-uploads-in-gatsby-js\/","title":{"rendered":"Handling Robust Video Uploads"},"content":{"rendered":"<div class=\"wp-block-cloudinary-markdown \"><p>Adding upload support, especially videos to websites and apps, comes with considerable research for new and experienced developers. \u201cHow to deal with file size and storage space for videos?\u201d, \u201cWhat standard video format should the upload support?\u201care some of the questions that might arise.<\/p>\n<p>This article shows you how to add video upload support to a Gatby.js app using Cloudinary Upload Widget &#8211; a complete, interactive user interface that enables file upload from various sources to your website or web application.<\/p>\n<p><a href=\"https:\/\/www.gatsbyjs.com\/\">Gatsby<\/a><a href=\"https:\/\/www.gatsbyjs.com\/\">.js<\/a> is a React-based front-end development framework used to build rich and optimized website and web applications. It offers features including SEO, security, integrations, and accessibility, without installing additional packages.<\/p>\n<p><a href=\"https:\/\/cloudinary.com\/\">Cloudinary<\/a> is a platform that enables you to upload, store, manage, transform, and deliver images and videos for websites and web applications.<\/p>\n<h2>Sandbox<\/h2>\n<p>We completed this project in <a href=\"https:\/\/codesandbox.io\/s\/cloudinary-upload-widget-main-r06ny\">a Codesandbox<\/a>, and you can fork it to run the code.<\/p>\n<\/div>\n  \n  <div class=\"wp-block-cloudinary-code-sandbox \">\n    <iframe\n      src=\"https:\/\/codesandbox.io\/embed\/cloudinary-upload-widget-main-r06ny?theme=dark&amp;codemirror=1&amp;highlights=&amp;editorsize=50&amp;fontsize=14&amp;expanddevtools=0&amp;hidedevtools=0&amp;eslint=0&amp;forcerefresh=0&amp;hidenavigation=0&amp;initialpath=%2F&amp;module=%2Fsrc%2Fpages%2Findex.js&amp;moduleview=0&amp;previewwindow=&amp;view=&amp;runonclick=1\"\n      height=\"500\"\n      style=\"width: 100%;\"\n      title=\"Robust video upload widget\"\n      loading=\"lazy\"\n      allow=\"accelerometer; ambient-light-sensor; camera; encrypted-media; geolocation; gyroscope; hid; microphone; midi; payment; usb; vr; xr-spatial-tracking\"\n      sandbox=\"allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts\"\n    ><\/iframe>\n  <\/div>\n\n  <div class=\"wp-block-cloudinary-markdown \"><h2>Prerequisites<\/h2>\n<p>We need to install the Gatsby-CLI globally and create a new Gatsby.js project using NPM &#8211; a command line package manager. You can also use Yarn.<\/p>\n<p>If you already have a Gatsby project running, you can skip this Gatsby installation step.<\/p>\n<p>In the desired directory for our project, we run:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">    npm install -g gatsby-cli &amp;&amp; gatsby <span class=\"hljs-keyword\">new<\/span> upload-widget\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><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>This command creates a Gatsby project called <strong>upload-widget<\/strong> using the default Gatsby <a href=\"https:\/\/github.com\/gatsbyjs\/gatsby-starter-default\">starter<\/a>.<\/p>\n<p>We proceed to install the required dependencies with:<\/p>\n<pre class=\"js-syntax-highlighted\"><span><code class=\"hljs shcb-wrap-lines\">    npm install react-helmet\n<\/code><\/span><\/pre>\n<p><code>react-helmet<\/code> is a <a href=\"https:\/\/github.com\/nfl\/react-helmet\">library<\/a> that takes plain HTML tags and outputs plain HTML tags. It will help us avoid the <code>Reference error: Window is not Defined<\/code> error when using client-side only packages in Gatsby.js.<\/p>\n<p>Find all other methods for using client-side only packages in Gatsby.js <a href=\"https:\/\/www.gatsbyjs.com\/docs\/using-client-side-only-packages\/\">here<\/a>.<\/p>\n<h2>Adding the upload widget<\/h2>\n<p>With the project dependencies installed, we can now set up our application to use Cloudinary Upload Widget. To use the Cloudinary Upload Widget in our application, we need to include the script from a CDN in our application using <code>react-helmet<\/code>, a package we installed earlier.\nAdd the script from a CDN to  <code>index.js<\/code> file to use Cloudinary Upload Widget:<\/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-keyword\">import<\/span> * <span class=\"hljs-keyword\">as<\/span> React <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\"react\"<\/span>\n    <span class=\"hljs-keyword\">import<\/span> { Helmet } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\"react-helmet\"<\/span>\n    <span class=\"hljs-keyword\">import<\/span> Layout <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\"..\/components\/layout\"<\/span>\n    <span class=\"hljs-keyword\">const<\/span> IndexPage = <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> {\n      <span class=\"hljs-keyword\">return<\/span> (\n        <span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Layout<\/span>&gt;<\/span>\n          <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Helmet<\/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\">\"https:\/\/upload-widget.cloudinary.com\/global\/all.js\"<\/span> \/&gt;<\/span><span class=\"handlebars\"><span class=\"xml\">\n          <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">Helmet<\/span>&gt;<\/span>\n          <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">className<\/span>=<span class=\"hljs-string\">\"upload-container\"<\/span>&gt;<\/span>\n              <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span>&gt;<\/span>Upload Video<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span>&gt;<\/span>\n              <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span>&gt;<\/span>\n                Uploaded Video to Cloudinary\n              <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">p<\/span>&gt;<\/span>\n          <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">Layout<\/span>&gt;<\/span><\/span><\/span><\/span>\n      )\n    }\n    <span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> IndexPage\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>With that done, we can update  <code>index.js<\/code> and configure Cloudinary Upload Widget to upload videos to Cloudinary:<\/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-keyword\">import<\/span> * <span class=\"hljs-keyword\">as<\/span> React <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\"react\"<\/span>\n    <span class=\"hljs-keyword\">import<\/span> { Helmet } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\"react-helmet\"<\/span>\n    <span class=\"hljs-keyword\">import<\/span> Layout <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\"..\/components\/layout\"<\/span>\n    <span class=\"hljs-keyword\">const<\/span> IndexPage = <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> {\n      <span class=\"hljs-keyword\">const<\/span> &#91;url, setURL] = React.useState(<span class=\"hljs-literal\">null<\/span>)\n      <span class=\"hljs-keyword\">const<\/span> openWidget = <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> {\n        <span class=\"hljs-built_in\">window<\/span>.cloudinary\n          .createUploadWidget(\n            {\n              <span class=\"hljs-attr\">cloudName<\/span>: <span class=\"hljs-string\">\"dtgbzmpca\"<\/span>,\n              <span class=\"hljs-attr\">uploadPreset<\/span>: <span class=\"hljs-string\">\"tca2j0ee\"<\/span>\n            },\n            (error, result) =&gt; {\n              <span class=\"hljs-keyword\">if<\/span> (!error &amp;&amp; result &amp;&amp; result.event === <span class=\"hljs-string\">\"success\"<\/span>) {\n                setURL(result.info.url)\n              }\n            }\n          )\n          .open()\n      }\n      <span class=\"hljs-keyword\">return<\/span> (\n        <span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Layout<\/span>&gt;<\/span>\n          <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Helmet<\/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\">\"https:\/\/upload-widget.cloudinary.com\/global\/all.js\"<\/span> \/&gt;<\/span><span class=\"handlebars\"><span class=\"xml\">\n          <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">Helmet<\/span>&gt;<\/span>\n          <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">className<\/span>=<span class=\"hljs-string\">\"upload-container\"<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span> <span class=\"hljs-attr\">onClick<\/span>=<span class=\"hljs-string\">{()<\/span> =&gt;<\/span> openWidget()}&gt;Upload Video<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span>&gt;<\/span>\n            {url &amp;&amp; (\n              <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span>&gt;<\/span>\n                Uploaded Video Url <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">span<\/span>&gt;<\/span>{url}<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">span<\/span>&gt;<\/span>\n              <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">p<\/span>&gt;<\/span>\n            )}\n          <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">Layout<\/span>&gt;<\/span><\/span><\/span><\/span>\n      )\n    }\n    <span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> IndexPage\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>In the snippet above, we added a state variable to store an uploaded video URL and a function to configure the Cloudinary Upload Widget.<\/p>\n<p>We then use the callback function to check for errors and update the URL based on the returned result.<\/p>\n<p>Finally, we created a button that triggers the widget when clicked and conditionally displays the returned URL.<\/p>\n<blockquote>\n<p>You also need a <a href=\"https:\/\/cloudinary.com\/homepage-2\">Cloudinary<\/a> <a href=\"https:\/\/cloudinary.com\/homepage-2\">a<\/a><a href=\"https:\/\/cloudinary.com\/homepage-2\">ccount<\/a> for video upload. <a href=\"http:\/\/www.cloudinary.com\/signup\"><strong>S<\/strong><\/a><a href=\"http:\/\/www.cloudinary.com\/signup\"><strong>ignup<\/strong><\/a> <strong>is completely free<\/strong>.<\/p>\n<\/blockquote>\n<p>The Cloudinary Upload Widget also configures <code>cloudName<\/code>, which is the name of your Cloudinary account. To get the value of <code>cloudName<\/code>, <a href=\"https:\/\/cloudinary.com\/users\/login\">log in to your Cloudinary account<\/a>, navigate to the dashboard, and copy the value, as shown in the highlighted section below.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-marketing-res.cloudinary.com\/image\/upload\/c_limit,w_2000\/f_auto\/q_auto\/media_jams\/s_4BCCCE95ACE9B0C1081840B08C278ED838CD7BEFE9CA8C7C882D08A88A918EB2_1620114874519_cloudname.png\" alt=\"Shaded portions are where your cloud name is located in cloudinary\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"1600\" height=\"236\"\/><\/p>\n<h2>Managing upload presets<\/h2>\n<p><code>uploadPreset<\/code> is a parameter that enables us to centrally define a set of asset upload options instead of specifying them in each upload call. To get your upload preset:<\/p>\n<p>Log in to your Cloudinary account, click on the <strong>Settings<\/strong> icon and select the upload tab.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-marketing-res.cloudinary.com\/image\/upload\/c_limit,w_2000\/f_auto\/q_auto\/media_jams\/s_7253610ED03EC64B3235CC663FBBC9E11370C64162FF6B53472AA77391479880_1620735074131_Screenshot+2021-05-11+at+12.57.18.png\" alt=\"click settings and upload button\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"2000\" height=\"1229\"\/><\/p>\n<p>Navigate to the <strong>Upload presets<\/strong> section, click on the <strong>Add Upload preset<\/strong> if you don\u2019t have one or copy an existing one if you do.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-marketing-res.cloudinary.com\/image\/upload\/c_limit,w_2000\/f_auto\/q_auto\/media_jams\/s_7253610ED03EC64B3235CC663FBBC9E11370C64162FF6B53472AA77391479880_1620735103221_Screenshot+2021-05-11+at+12.58.12.png\" alt=\"select preset\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"2000\" height=\"1229\"\/><\/p>\n<p>Copy the preset name and change the <strong>signing mode<\/strong> to <strong>unsigned<\/strong> to enable unsigned uploading to Cloudinary with this upload preset.<\/p>\n<blockquote>\n<p><strong>Signed<\/strong> and <strong>Unsigned Uploads<\/strong> are ways in which Cloudinary Upload Widget support file upload to Cloudinary. The difference is, Signed Upload requires a bit more setup and coding but provide a more secure upload process when required, while Unsigned Upload makes it quick and simple for you to provide a UI where users can upload content, but it is less secure.<\/p>\n<\/blockquote>\n<p>For this tutorial, we used the Unsigned Upload.<\/p>\n<p>Then click on the <strong>Save<\/strong> button to save the changes.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-marketing-res.cloudinary.com\/image\/upload\/c_limit,w_2000\/f_auto\/q_auto\/media_jams\/s_7253610ED03EC64B3235CC663FBBC9E11370C64162FF6B53472AA77391479880_1620735178738_Screenshot+2021-05-11+at+12.58.52.png\" alt=\"copy preset name and save\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"2000\" height=\"1229\"\/><\/p>\n<p>With this, you can now test the application and upload video.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-marketing-res.cloudinary.com\/image\/upload\/c_limit,w_2000\/f_auto\/q_auto\/media_jams\/s_4BCCCE95ACE9B0C1081840B08C278ED838CD7BEFE9CA8C7C882D08A88A918EB2_1620117353120_Screenshot+2021-05-04+at+02.23.48.png\" alt=\"Cloudinary Upload Widget\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"2000\" height=\"956\"\/><\/p>\n<h1>Conclusion<\/h1>\n<p>This post discussed how to add video upload functionality to Gatsby.js project using Cloudinary Upload Widget. Try out the various upload options specified in the widget<\/p>\n<p>You may find these resources useful<\/p>\n<ul>\n<li>\n<a href=\"https:\/\/www.gatsbyjs.com\/docs\/using-client-side-only-packages\/\">Using Client-Side only packages in Gatsby.js<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/documentation\/upload_widget\">Cloudinary Upload Widget<\/a>\n<\/li>\n<\/ul>\n<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":41,"featured_media":28172,"comment_status":"","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[399,378,134,371,373,303],"class_list":["post-28171","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-ui-widget","tag-gatsbyjs","tag-guest-post","tag-under-review","tag-upload","tag-video"],"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>Handling Robust Video Uploads<\/title>\n<meta name=\"description\" content=\"Learn to utilize a robust video uploader in a Gatsby.js application\" \/>\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\/guest_post\/handling-robust-video-uploads-in-gatsby-js\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Handling Robust Video Uploads\" \/>\n<meta property=\"og:description\" content=\"Learn to utilize a robust video uploader in a Gatsby.js application\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/guest_post\/handling-robust-video-uploads-in-gatsby-js\/\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2022-03-23T22:25:10+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925219\/Web_Assets\/blog\/88d52c364a9b5887a8b4587893412d3ebbc9b071-5184x3456-1_28172f6ce2\/88d52c364a9b5887a8b4587893412d3ebbc9b071-5184x3456-1_28172f6ce2.jpg?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"5184\" \/>\n\t<meta property=\"og:image:height\" content=\"3456\" \/>\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\/guest_post\/handling-robust-video-uploads-in-gatsby-js\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/handling-robust-video-uploads-in-gatsby-js\/\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Handling Robust Video Uploads\",\"datePublished\":\"2022-03-23T22:25:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/handling-robust-video-uploads-in-gatsby-js\/\"},\"wordCount\":4,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/handling-robust-video-uploads-in-gatsby-js\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925219\/Web_Assets\/blog\/88d52c364a9b5887a8b4587893412d3ebbc9b071-5184x3456-1_28172f6ce2\/88d52c364a9b5887a8b4587893412d3ebbc9b071-5184x3456-1_28172f6ce2.jpg?_i=AA\",\"keywords\":[\"(UI) Widget\",\"GatsbyJS\",\"Guest Post\",\"Under Review\",\"Upload\",\"Video\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2022\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/handling-robust-video-uploads-in-gatsby-js\/\",\"url\":\"https:\/\/cloudinary.com\/blog\/guest_post\/handling-robust-video-uploads-in-gatsby-js\/\",\"name\":\"Handling Robust Video Uploads\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/handling-robust-video-uploads-in-gatsby-js\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/handling-robust-video-uploads-in-gatsby-js\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925219\/Web_Assets\/blog\/88d52c364a9b5887a8b4587893412d3ebbc9b071-5184x3456-1_28172f6ce2\/88d52c364a9b5887a8b4587893412d3ebbc9b071-5184x3456-1_28172f6ce2.jpg?_i=AA\",\"datePublished\":\"2022-03-23T22:25:10+00:00\",\"description\":\"Learn to utilize a robust video uploader in a Gatsby.js application\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/handling-robust-video-uploads-in-gatsby-js\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/guest_post\/handling-robust-video-uploads-in-gatsby-js\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/handling-robust-video-uploads-in-gatsby-js\/#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925219\/Web_Assets\/blog\/88d52c364a9b5887a8b4587893412d3ebbc9b071-5184x3456-1_28172f6ce2\/88d52c364a9b5887a8b4587893412d3ebbc9b071-5184x3456-1_28172f6ce2.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925219\/Web_Assets\/blog\/88d52c364a9b5887a8b4587893412d3ebbc9b071-5184x3456-1_28172f6ce2\/88d52c364a9b5887a8b4587893412d3ebbc9b071-5184x3456-1_28172f6ce2.jpg?_i=AA\",\"width\":5184,\"height\":3456},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/handling-robust-video-uploads-in-gatsby-js\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Handling Robust Video Uploads\"}]},{\"@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":"Handling Robust Video Uploads","description":"Learn to utilize a robust video uploader in a Gatsby.js application","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\/guest_post\/handling-robust-video-uploads-in-gatsby-js\/","og_locale":"en_US","og_type":"article","og_title":"Handling Robust Video Uploads","og_description":"Learn to utilize a robust video uploader in a Gatsby.js application","og_url":"https:\/\/cloudinary.com\/blog\/guest_post\/handling-robust-video-uploads-in-gatsby-js\/","og_site_name":"Cloudinary Blog","article_published_time":"2022-03-23T22:25:10+00:00","og_image":[{"width":5184,"height":3456,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925219\/Web_Assets\/blog\/88d52c364a9b5887a8b4587893412d3ebbc9b071-5184x3456-1_28172f6ce2\/88d52c364a9b5887a8b4587893412d3ebbc9b071-5184x3456-1_28172f6ce2.jpg?_i=AA","type":"image\/jpeg"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/guest_post\/handling-robust-video-uploads-in-gatsby-js\/#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/handling-robust-video-uploads-in-gatsby-js\/"},"author":{"name":"","@id":""},"headline":"Handling Robust Video Uploads","datePublished":"2022-03-23T22:25:10+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/handling-robust-video-uploads-in-gatsby-js\/"},"wordCount":4,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/handling-robust-video-uploads-in-gatsby-js\/#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925219\/Web_Assets\/blog\/88d52c364a9b5887a8b4587893412d3ebbc9b071-5184x3456-1_28172f6ce2\/88d52c364a9b5887a8b4587893412d3ebbc9b071-5184x3456-1_28172f6ce2.jpg?_i=AA","keywords":["(UI) Widget","GatsbyJS","Guest Post","Under Review","Upload","Video"],"inLanguage":"en-US","copyrightYear":"2022","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/guest_post\/handling-robust-video-uploads-in-gatsby-js\/","url":"https:\/\/cloudinary.com\/blog\/guest_post\/handling-robust-video-uploads-in-gatsby-js\/","name":"Handling Robust Video Uploads","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/handling-robust-video-uploads-in-gatsby-js\/#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/handling-robust-video-uploads-in-gatsby-js\/#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925219\/Web_Assets\/blog\/88d52c364a9b5887a8b4587893412d3ebbc9b071-5184x3456-1_28172f6ce2\/88d52c364a9b5887a8b4587893412d3ebbc9b071-5184x3456-1_28172f6ce2.jpg?_i=AA","datePublished":"2022-03-23T22:25:10+00:00","description":"Learn to utilize a robust video uploader in a Gatsby.js application","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/handling-robust-video-uploads-in-gatsby-js\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/guest_post\/handling-robust-video-uploads-in-gatsby-js\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/guest_post\/handling-robust-video-uploads-in-gatsby-js\/#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925219\/Web_Assets\/blog\/88d52c364a9b5887a8b4587893412d3ebbc9b071-5184x3456-1_28172f6ce2\/88d52c364a9b5887a8b4587893412d3ebbc9b071-5184x3456-1_28172f6ce2.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925219\/Web_Assets\/blog\/88d52c364a9b5887a8b4587893412d3ebbc9b071-5184x3456-1_28172f6ce2\/88d52c364a9b5887a8b4587893412d3ebbc9b071-5184x3456-1_28172f6ce2.jpg?_i=AA","width":5184,"height":3456},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/guest_post\/handling-robust-video-uploads-in-gatsby-js\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Handling Robust Video Uploads"}]},{"@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\/v1681925219\/Web_Assets\/blog\/88d52c364a9b5887a8b4587893412d3ebbc9b071-5184x3456-1_28172f6ce2\/88d52c364a9b5887a8b4587893412d3ebbc9b071-5184x3456-1_28172f6ce2.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/28171","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=28171"}],"version-history":[{"count":0,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/28171\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/28172"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=28171"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=28171"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=28171"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}