{"id":28536,"date":"2022-04-28T14:40:01","date_gmt":"2022-04-28T14:40:01","guid":{"rendered":"http:\/\/how-to-validate-media-uploads-in-javascript"},"modified":"2022-04-28T14:40:01","modified_gmt":"2022-04-28T14:40:01","slug":"how-to-validate-media-uploads-in-javascript","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/guest_post\/how-to-validate-media-uploads-in-javascript\/","title":{"rendered":"How to Validate Media Uploads in JavaScript"},"content":{"rendered":"<div class=\"wp-block-cloudinary-markdown \"><p>Validation has become an essential concept in software development and the security of an application. We often run tests for vulnerability using validation on input fields. There are different types of validation in software development; this tutorial will focus on media files, validating the file extension, the number of files to be uploaded, and the file size.<\/p>\n<h2>Setup<\/h2>\n<p>We will be using the live-server dependency for our development to aid with live-reload capability. Run the command below to install the dependency globally.<\/p>\n<pre class=\"js-syntax-highlighted\"><span><code class=\"hljs shcb-wrap-lines\">npm install -g live-server\n<\/code><\/span><\/pre>\n<p>Navigate to the project folder and create an <code>index.html<\/code> file. paste the code below in the <code>index.html<\/code><\/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-meta\">&lt;!DOCTYPE <span class=\"hljs-meta-keyword\">html<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">html<\/span> <span class=\"hljs-attr\">lang<\/span>=<span class=\"hljs-string\">\"en\"<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">head<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta<\/span> <span class=\"hljs-attr\">charset<\/span>=<span class=\"hljs-string\">\"UTF-8\"<\/span> \/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta<\/span> <span class=\"hljs-attr\">http-equiv<\/span>=<span class=\"hljs-string\">\"X-UA-Compatible\"<\/span> <span class=\"hljs-attr\">content<\/span>=<span class=\"hljs-string\">\"IE=edge\"<\/span> \/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"viewport\"<\/span> <span class=\"hljs-attr\">content<\/span>=<span class=\"hljs-string\">\"width=device-width, initial-scale=1.0\"<\/span> \/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">title<\/span>&gt;<\/span>Validate File Uploads<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">title<\/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:\/\/cdn.tailwindcss.com\"<\/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\">head<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">body<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">main<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"flex justify-center h-screen items-center\"<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"flex flex-col justify-center\"<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"hidden\"<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"file\"<\/span> <span class=\"hljs-attr\">multiple<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"filePicker\"<\/span> \/&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"text-red-500 mb-4\"<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"error\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">p<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"text-green-500 mb-4\"<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"success\"<\/span>&gt;<\/span><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> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"grid place-items-center\"<\/span>&gt;<\/span>\n          <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"text-white bg-gray-700 hover:bg-gray-600 px-6 py-2 rounded\"<\/span>&gt;<\/span>\n            Upload\n          <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/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\">div<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">main<\/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\">\".\/index.js\"<\/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\">body<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">html<\/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><img decoding=\"async\" src=\"https:\/\/cloudinary-marketing-res.cloudinary.com\/image\/upload\/c_limit,w_2000\/f_auto\/q_auto\/media_jams\/s_1AA54D2032F74B53E24F57DEBFD5508296060FAFD01711ED294A9941B0949EAD_1645454211272_img_upload.PNG\" alt=\"\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"1886\" height=\"850\"\/><\/p>\n<h2>Create A List of Allowed Image and Video Types<\/h2>\n<p>Create an <code>index.js<\/code> file at the root of the project and paste the code below.<\/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\">const<\/span> videoMimeTypes = &#91;\n  <span class=\"hljs-string\">'video\/x-flv'<\/span>,\n  <span class=\"hljs-string\">'video\/x-ms-wmv'<\/span>,\n  <span class=\"hljs-string\">'video\/x-msvideo'<\/span>,\n  <span class=\"hljs-string\">'video\/quicktime'<\/span>,\n  <span class=\"hljs-string\">'video\/3gpp'<\/span>,\n  <span class=\"hljs-string\">'video\/MP2T'<\/span>,\n  <span class=\"hljs-string\">'application\/x-mpegURL'<\/span>,\n  <span class=\"hljs-string\">'video\/mp4'<\/span>,\n];\n\n<span class=\"hljs-keyword\">const<\/span> imageMimeTypes = &#91;\n  <span class=\"hljs-string\">'image\/webp'<\/span>,\n  <span class=\"hljs-string\">'image\/tiff'<\/span>,\n  <span class=\"hljs-string\">'image\/svg+xml'<\/span>,\n  <span class=\"hljs-string\">'image\/png'<\/span>,\n  <span class=\"hljs-string\">'image\/jpeg'<\/span>,\n  <span class=\"hljs-string\">'image\/vnd.microsoft.icon'<\/span>,\n  <span class=\"hljs-string\">'image\/gif'<\/span>,\n  <span class=\"hljs-string\">'image\/bmp'<\/span>,\n];\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>The code above are the mime types where we add our extension types for images and videos. These types are the list of allowed types that can be uploaded.<\/p>\n<h2>Grab DOM Elements<\/h2>\n<p>Before writing our validation functions, create an <code>onload<\/code> function to confirm that the page is done loading before running the javascript code.<\/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-built_in\">window<\/span>.onload = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">validation<\/span>(<span class=\"hljs-params\"><\/span>) <\/span>{\n  <span class=\"hljs-comment\">\/\/our code will be here<\/span>\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>Our codes will be nested within the <code>onload<\/code> function.<\/p>\n<p>Create javascript variables to point to the HTML tags using the <code>querySelector<\/code>. Paste the code below inside the <code>onload<\/code> function.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-keyword\">const<\/span> filePicker = <span class=\"hljs-built_in\">document<\/span>.querySelector(<span class=\"hljs-string\">'input'<\/span>);\n<span class=\"hljs-keyword\">const<\/span> button = <span class=\"hljs-built_in\">document<\/span>.querySelector(<span class=\"hljs-string\">'button'<\/span>);\n<span class=\"hljs-keyword\">const<\/span> errorParagraph = <span class=\"hljs-built_in\">document<\/span>.querySelector(<span class=\"hljs-string\">'#error'<\/span>);\n<span class=\"hljs-keyword\">const<\/span> successParagraph = <span class=\"hljs-built_in\">document<\/span>.querySelector(<span class=\"hljs-string\">'#success'<\/span>);\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><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<h2>Handle Upload<\/h2>\n<p>Next is to implement an onClick on the upload button. The function below will execute once we click on the upload button. It triggers the filePicker function, which is attached to a change listener. The change event is triggered when we upload a file.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">button.addEventListener(<span class=\"hljs-string\">'click'<\/span>, () =&gt; {\n  <span class=\"hljs-keyword\">if<\/span> (filePicker) filePicker.click();\n});\n    \nfilePicker.addEventListener(<span class=\"hljs-string\">'change'<\/span>, (e) =&gt; {\n  <span class=\"hljs-keyword\">const<\/span> files = e.target.files;\n  console.log(files);\n    \n<span class=\"hljs-comment\">\/\/ validation functions here <\/span>\n    \n});\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<h2>Write Validation Functions<\/h2>\n<p>Once we drop the file in the browser, we need to start validating it. Here are the function signature of the validation we need to write:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">validateSize<\/span>(<span class=\"hljs-params\">file, max<\/span>)\n<span class=\"hljs-title\">function<\/span> <span class=\"hljs-title\">validateExtension<\/span>(<span class=\"hljs-params\">file, allowedExtensions = &#91;]<\/span>)\n<span class=\"hljs-title\">function<\/span> <span class=\"hljs-title\">validateLength<\/span>(<span class=\"hljs-params\">files, max<\/span>)\n<span class=\"hljs-title\">function<\/span> <span class=\"hljs-title\">updateErrorMessage<\/span>(<span class=\"hljs-params\">el, message<\/span>)\n<span class=\"hljs-title\">function<\/span> <span class=\"hljs-title\">updateSuccessMessage<\/span>(<span class=\"hljs-params\">el, message<\/span>)\n<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><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>Each of these functions has a vital role in validating our file upload.<\/p>\n<ul>\n<li>\n<strong>validateSize<\/strong>: handles the uploaded file size.<\/li>\n<li>\n<strong>validateExtension<\/strong>: handles the file extension of the uploaded file as listed in our mime types.<\/li>\n<li>\n<strong>validateLength<\/strong>: handles the number of files we can upload at once.<\/li>\n<\/ul>\n<p>We will be showing the code behind each of these functions as we go further. We will first start with the <strong>validateSize<\/strong> function, which validates the size of our file in Megabyte.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">validateSize<\/span>(<span class=\"hljs-params\">file, max<\/span>) <\/span>{\n  <span class=\"hljs-keyword\">return<\/span> file.size &lt;= max;\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><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>Next is the <strong>validateExtension<\/strong> funtion**,** which ****validates the type of extensions allowed.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">validateExtension<\/span>(<span class=\"hljs-params\">file, allowedExtensions = &#91;]<\/span>) <\/span>{\n  <span class=\"hljs-keyword\">return<\/span> allowedExtensions.includes(file.type);\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><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>Next is the <strong>validateLength,<\/strong> which validates that the total number of files uploaded at once is valid.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">validateLength<\/span>(<span class=\"hljs-params\">file, max<\/span>)<\/span>{\n  <span class=\"hljs-keyword\">return<\/span> file.length &lt;= max;\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><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<h2>Error Message Functions<\/h2>\n<p>We can also have a few functions to display our error and success messages.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">updateErrorMessage<\/span>(<span class=\"hljs-params\">el, message<\/span>) <\/span>{\n  el.innerText = message;\n  <span class=\"hljs-built_in\">console<\/span>.warn(message);\n}\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">updateSuccessMessage<\/span>(<span class=\"hljs-params\">el, message<\/span>) <\/span>{\n  el.innerText = message;\n  <span class=\"hljs-built_in\">console<\/span>.log(message);\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><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<h2>Validate the Files<\/h2>\n<p>Now that we have defined our validation, error, and success function, we will head back to the filepicker change handle to start our conditions for validation using the functions.\nWe will start by validating only length. To validate only the length paste the code below in the change listener.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-keyword\">if<\/span> (!validateLength(files, <span class=\"hljs-number\">3<\/span>)) {\n  updateErrorMessage(errorParagraph, <span class=\"hljs-string\">'Number of files must not exceed 3.'<\/span>);\n} <span class=\"hljs-keyword\">else<\/span> {\n  updateSuccessMessage(successParagraph, <span class=\"hljs-string\">'All files passed validation!'<\/span>);\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><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><img decoding=\"async\" src=\"https:\/\/cloudinary-marketing-res.cloudinary.com\/image\/upload\/c_limit,w_2000\/f_auto\/q_auto\/media_jams\/s_1AA54D2032F74B53E24F57DEBFD5508296060FAFD01711ED294A9941B0949EAD_1645454987579_length.PNG\" alt=\"\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"1860\" height=\"817\"\/><\/p>\n<p>To validate length and extensions of our files paste the code below.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-keyword\">if<\/span> (!validateLength(files, <span class=\"hljs-number\">3<\/span>)) {\n  updateErrorMessage(errorParagraph, <span class=\"hljs-string\">'Number of files must not exceed 3.'<\/span>);\n} <span class=\"hljs-keyword\">else<\/span> {\n  <span class=\"hljs-keyword\">for<\/span> (f <span class=\"hljs-keyword\">of<\/span> files) {\n    <span class=\"hljs-keyword\">if<\/span> (!validateExtension(f, &#91;...imageMimeTypes, ...videoMimeTypes])) {\n      updateErrorMessage(\n        errorParagraph,\n        <span class=\"hljs-string\">`<span class=\"hljs-subst\">${f.name}<\/span> is neither an image or a video.`<\/span>\n      );\n      <span class=\"hljs-keyword\">break<\/span>;\n    }\n    updateSuccessMessage(successParagraph, <span class=\"hljs-string\">'All files passed validation!'<\/span>);\n  }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><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><img decoding=\"async\" src=\"https:\/\/cloudinary-marketing-res.cloudinary.com\/image\/upload\/c_limit,w_2000\/f_auto\/q_auto\/media_jams\/s_1AA54D2032F74B53E24F57DEBFD5508296060FAFD01711ED294A9941B0949EAD_1645455055092_extension.PNG\" alt=\"\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"1391\" height=\"794\"\/><\/p>\n<p>To validate the size, length, and extension of every uploaded file, paste the code below.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-keyword\">if<\/span> (!validateLength(files, <span class=\"hljs-number\">3<\/span>)) {\n  updateErrorMessage(errorParagraph, <span class=\"hljs-string\">'Number of files must not exceed 3.'<\/span>);\n} <span class=\"hljs-keyword\">else<\/span> {\n  <span class=\"hljs-keyword\">for<\/span> (f <span class=\"hljs-keyword\">of<\/span> files) {\n    <span class=\"hljs-keyword\">if<\/span> (!validateExtension(f, &#91;...imageMimeTypes, ...videoMimeTypes])) {\n      updateErrorMessage(\n      errorParagraph,\n      <span class=\"hljs-string\">`<span class=\"hljs-subst\">${f.name}<\/span> is neither an image or a video.`<\/span>\n      );\n      <span class=\"hljs-keyword\">break<\/span>;\n    }\n    <span class=\"hljs-keyword\">if<\/span> (!validateSize(f, <span class=\"hljs-number\">1024<\/span> ** <span class=\"hljs-number\">2<\/span> * <span class=\"hljs-number\">2<\/span>)) {\n      updateErrorMessage(\n      errorParagraph,\n      <span class=\"hljs-string\">`<span class=\"hljs-subst\">${f.name}<\/span>'s size exceeds 2 Megabytes`<\/span>\n      );\n      <span class=\"hljs-keyword\">break<\/span>;\n    }\n    updateSuccessMessage(successParagraph, <span class=\"hljs-string\">'All files passed validation!'<\/span>);\n  }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><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<h2>Conclusion<\/h2>\n<p>In this tutorial, we have discussed and shown how easy it is to validate media files making it easier to protect our applications from unwanted and irrelevant files that may disrupt the performance of our application. The complete source code for this tutorial is available on <a href=\"https:\/\/codesandbox.io\/s\/happy-nobel-lrxfl3?file=\/index.html\">CodeSandbox<\/a>.<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":41,"featured_media":28537,"comment_status":"","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[134,177,371],"class_list":["post-28536","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-guest-post","tag-javascript","tag-under-review"],"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>How to Validate Media Uploads in JavaScript<\/title>\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\/how-to-validate-media-uploads-in-javascript\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Validate Media Uploads in JavaScript\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/guest_post\/how-to-validate-media-uploads-in-javascript\/\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2022-04-28T14:40:01+00:00\" \/>\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\/how-to-validate-media-uploads-in-javascript\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/how-to-validate-media-uploads-in-javascript\/\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"How to Validate Media Uploads in JavaScript\",\"datePublished\":\"2022-04-28T14:40:01+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/how-to-validate-media-uploads-in-javascript\/\"},\"wordCount\":7,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/how-to-validate-media-uploads-in-javascript\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681924290\/Web_Assets\/blog\/1676b87418aee7ea989718e391fbbb2631b4f44f-1860x817-1_28537a1d17\/1676b87418aee7ea989718e391fbbb2631b4f44f-1860x817-1_28537a1d17.png?_i=AA\",\"keywords\":[\"Guest Post\",\"Javascript\",\"Under Review\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2022\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/how-to-validate-media-uploads-in-javascript\/\",\"url\":\"https:\/\/cloudinary.com\/blog\/guest_post\/how-to-validate-media-uploads-in-javascript\/\",\"name\":\"How to Validate Media Uploads in JavaScript\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/how-to-validate-media-uploads-in-javascript\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/how-to-validate-media-uploads-in-javascript\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681924290\/Web_Assets\/blog\/1676b87418aee7ea989718e391fbbb2631b4f44f-1860x817-1_28537a1d17\/1676b87418aee7ea989718e391fbbb2631b4f44f-1860x817-1_28537a1d17.png?_i=AA\",\"datePublished\":\"2022-04-28T14:40:01+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/how-to-validate-media-uploads-in-javascript\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/guest_post\/how-to-validate-media-uploads-in-javascript\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/how-to-validate-media-uploads-in-javascript\/#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681924290\/Web_Assets\/blog\/1676b87418aee7ea989718e391fbbb2631b4f44f-1860x817-1_28537a1d17\/1676b87418aee7ea989718e391fbbb2631b4f44f-1860x817-1_28537a1d17.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681924290\/Web_Assets\/blog\/1676b87418aee7ea989718e391fbbb2631b4f44f-1860x817-1_28537a1d17\/1676b87418aee7ea989718e391fbbb2631b4f44f-1860x817-1_28537a1d17.png?_i=AA\",\"width\":1860,\"height\":817},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/how-to-validate-media-uploads-in-javascript\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to Validate Media Uploads in JavaScript\"}]},{\"@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":"How to Validate Media Uploads in JavaScript","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\/how-to-validate-media-uploads-in-javascript\/","og_locale":"en_US","og_type":"article","og_title":"How to Validate Media Uploads in JavaScript","og_url":"https:\/\/cloudinary.com\/blog\/guest_post\/how-to-validate-media-uploads-in-javascript\/","og_site_name":"Cloudinary Blog","article_published_time":"2022-04-28T14:40:01+00:00","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/guest_post\/how-to-validate-media-uploads-in-javascript\/#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/how-to-validate-media-uploads-in-javascript\/"},"author":{"name":"","@id":""},"headline":"How to Validate Media Uploads in JavaScript","datePublished":"2022-04-28T14:40:01+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/how-to-validate-media-uploads-in-javascript\/"},"wordCount":7,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/how-to-validate-media-uploads-in-javascript\/#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681924290\/Web_Assets\/blog\/1676b87418aee7ea989718e391fbbb2631b4f44f-1860x817-1_28537a1d17\/1676b87418aee7ea989718e391fbbb2631b4f44f-1860x817-1_28537a1d17.png?_i=AA","keywords":["Guest Post","Javascript","Under Review"],"inLanguage":"en-US","copyrightYear":"2022","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/guest_post\/how-to-validate-media-uploads-in-javascript\/","url":"https:\/\/cloudinary.com\/blog\/guest_post\/how-to-validate-media-uploads-in-javascript\/","name":"How to Validate Media Uploads in JavaScript","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/how-to-validate-media-uploads-in-javascript\/#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/how-to-validate-media-uploads-in-javascript\/#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681924290\/Web_Assets\/blog\/1676b87418aee7ea989718e391fbbb2631b4f44f-1860x817-1_28537a1d17\/1676b87418aee7ea989718e391fbbb2631b4f44f-1860x817-1_28537a1d17.png?_i=AA","datePublished":"2022-04-28T14:40:01+00:00","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/how-to-validate-media-uploads-in-javascript\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/guest_post\/how-to-validate-media-uploads-in-javascript\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/guest_post\/how-to-validate-media-uploads-in-javascript\/#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681924290\/Web_Assets\/blog\/1676b87418aee7ea989718e391fbbb2631b4f44f-1860x817-1_28537a1d17\/1676b87418aee7ea989718e391fbbb2631b4f44f-1860x817-1_28537a1d17.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681924290\/Web_Assets\/blog\/1676b87418aee7ea989718e391fbbb2631b4f44f-1860x817-1_28537a1d17\/1676b87418aee7ea989718e391fbbb2631b4f44f-1860x817-1_28537a1d17.png?_i=AA","width":1860,"height":817},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/guest_post\/how-to-validate-media-uploads-in-javascript\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How to Validate Media Uploads in JavaScript"}]},{"@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\/v1681924290\/Web_Assets\/blog\/1676b87418aee7ea989718e391fbbb2631b4f44f-1860x817-1_28537a1d17\/1676b87418aee7ea989718e391fbbb2631b4f44f-1860x817-1_28537a1d17.png?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/28536","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=28536"}],"version-history":[{"count":0,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/28536\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/28537"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=28536"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=28536"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=28536"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}