{"id":27945,"date":"2022-02-08T21:18:16","date_gmt":"2022-02-08T21:18:16","guid":{"rendered":"http:\/\/Previewing-photoshop-file-content-in-a-Nuxt.Js-app"},"modified":"2023-12-19T12:28:11","modified_gmt":"2023-12-19T20:28:11","slug":"previewing-photoshop-file-content-in-a-nuxt-js-app","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/guest_post\/previewing-photoshop-file-content-in-a-nuxt-js-app\/","title":{"rendered":"Previewing Photoshop File Content in a NuxtJS App"},"content":{"rendered":"<div class=\"wp-block-cloudinary-markdown \"><p>Working with <a href=\"https:\/\/cloudinary.com\/guides\/image-formats\/understanding-psd-complete-guide\">PSD files<\/a> can be complex as they are not natively supported by HTML. However, it is a widely used format globally by creators and professionals in various fields. Let us learn how we can preview the photoshop file and its content for our users.<\/p>\n<h1>Codesandbox<\/h1>\n<p>The final project can be viewed on <a href=\"https:\/\/codesandbox.io\/s\/previewing-photoshop-f5lq2\">Codesandbox<\/a>.<\/p>\n<\/div>\n\n\n  <div class=\"wp-block-cloudinary-code-sandbox \">\n    <iframe\n      src=\"https:\/\/codesandbox.io\/embed\/muddy-platform-p69km?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=&amp;moduleview=0&amp;previewwindow=&amp;view=&amp;runonclick=1\"\n      height=\"500\"\n      style=\"width: 100%;\"\n      title=\"previewing-photoshop\"\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\n<div class=\"wp-block-cloudinary-markdown \"><p>You can find the full source code on my <a href=\"https:\/\/github.com\/musebe\/nuxtjs-photoshop-preview\">Github<\/a> repository.<\/p>\n<h1>Nuxt.Js App Setup<\/h1>\n<p><a href=\"https:\/\/nuxtjs.org\">Nuxt.Js<\/a> is a performant <a href=\"http:\/\/vuejs.org\">Vue.Js<\/a> framework that boosts developer experience and productivity. To get started ensure you have yarn or npm v5.2+\/v6.1+ installed. Open your terminal in your preferred working directory.<\/p>\n<pre class=\"js-syntax-highlighted\"><span><code class=\"hljs shcb-wrap-lines\">yarn create nuxt-app nuxtjs-photoshop-preview\n\nnpx create-nuxt-app nuxtjs-photoshop-preview\n\nnpm init nuxt-app nuxtjs-photoshop-preview\n<\/code><\/span><\/pre>\n<p>This will trigger a set of setup questions. Here are our recommended defaults:<\/p>\n<blockquote>\n<p>Project name: nuxtjs-photoshop-preview\nProgramming language: JavaScript\nPackage manager: Yarn\nUI framework: Tailwind CSS\nNuxt.js modules: N\/A\nLinting tools: N\/A\nTesting frameworks: None\nRendering mode: Universal (SSR\/SSG)\nDeployment target: Server (Node.js hosting)\nDevelopment tools: N\/A\nWhat is your Github username? &lt; your-github-username &gt;\nVersion control system: Git<\/p>\n<\/blockquote>\n<p>Once the setup and customization are complete you may enter the directory and run the project.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">cd nuxtjs-photoshop-preview\n\nyarn dev\n<span class=\"hljs-comment\"># OR<\/span>\nnpm run dev\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><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<p>You should now be able to view your project on <a href=\"http:\/\/localhost:3000\">http:\/\/localhost:3000<\/a>.<\/p>\n<h1>@nuxtjs\/cloudinary installation<\/h1>\n<p><a href=\"https:\/\/cloudinary\">Cloudinary<\/a> enables us to make the most of our media assets through its set of APIs and SDKs. Let us install the recommended Nuxt.Js plugin, <a href=\"https:\/\/cloudinary.nuxtjs.org\">@nuxtjs\/cloudinary<\/a>.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css shcb-wrap-lines\"><span class=\"hljs-selector-tag\">yarn<\/span> <span class=\"hljs-selector-tag\">add<\/span> <span class=\"hljs-keyword\">@nuxtjs<\/span>\/cloudinary\n# <span class=\"hljs-keyword\">or<\/span>\nnpm install @nuxtjs\/cloudinary\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>Once installation is complete, add the module in the <code>modules<\/code> section of the <code>nuxt.config.js<\/code> file:<\/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-comment\">\/\/ nuxt.config.js<\/span>\n<span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> {\n    ...\n    modules: &#91;\n        <span class=\"hljs-string\">'@nuxtjs\/cloudinary'<\/span>\n    ]\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>We will then configure our Cloudinary instance by adding a <code>cloudinary<\/code> section to the <code>nuxt.config.js<\/code> file:<\/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-comment\">\/\/ nuxt.config.js<\/span>\n<span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> {\n    ...\n    cloudinary: {\n        <span class=\"hljs-attr\">cloudName<\/span>: process.env.NUXT_ENV_CLOUDINARY_CLOUD_NAME,\n        <span class=\"hljs-attr\">useComponent<\/span>: <span class=\"hljs-literal\">true<\/span>,\n        <span class=\"hljs-attr\">secure<\/span>: <span class=\"hljs-literal\">true<\/span>\n    }\n    }\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<p>We refer to an environmental variable (<code>NUXT_ENV_CLOUDINARY_CLOUD_NAME<\/code>). Environmental variables are values we do not want in our codebase for either customization or security reasons. Let us first create the <code>.env<\/code> file which will contain our environmental variables:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css shcb-wrap-lines\"><span class=\"hljs-selector-tag\">touch<\/span> <span class=\"hljs-selector-class\">.env<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>We will then set our environmental variables in the file<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\">NUXT_ENV_CLOUDINARY_CLOUD_NAME=<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">secret-cloud-name<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><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<h1>Uploading photoshop files to Cloudinary<\/h1>\n<p>Before we preview the photoshop file, we need to upload it to Cloudinary. Let us create a form to do this.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\"><span class=\"hljs-comment\">&lt;!-- pages\/index.vue --&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">template<\/span>&gt;<\/span>\n    ...\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">form<\/span> @<span class=\"hljs-attr\">submit.prevent<\/span>=<span class=\"hljs-string\">\"upload\"<\/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\">label<\/span> <span class=\"hljs-attr\">for<\/span>=<span class=\"hljs-string\">\"psd\"<\/span> &gt;<\/span>\n            Photoshop file\n          <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">label<\/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\">\"mt-1\"<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span> \n                @<span class=\"hljs-attr\">change<\/span>=<span class=\"hljs-string\">\"handleFile\"<\/span> \n                <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"psd\"<\/span> \n                <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"psd\"<\/span> \n                <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"file\"<\/span> \n                <span class=\"hljs-attr\">accept<\/span>=<span class=\"hljs-string\">\".psd\"<\/span> \n                <span class=\"hljs-attr\">required<\/span> \n            \/&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\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n          <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span> <span class=\"hljs-attr\">v-if<\/span>=<span class=\"hljs-string\">\"uploading\"<\/span>&gt;<\/span>Uploading... <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">p<\/span>&gt;<\/span>\n          <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span> <span class=\"hljs-attr\">v-else<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"submit\"<\/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\">form<\/span>&gt;<\/span>\n    ...\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">template<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><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>The <code>handleFile<\/code> method, triggered when a file is selected, will save the selection in the page state.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\">\/\/ pages\/index.vue\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span>&gt;<\/span><span class=\"javascript\">\n<span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> {\n  data() {\n    <span class=\"hljs-keyword\">return<\/span> {\n      <span class=\"hljs-attr\">file<\/span>: <span class=\"hljs-literal\">null<\/span>,\n    };\n  },\n  <span class=\"hljs-attr\">methods<\/span>: {\n    <span class=\"hljs-keyword\">async<\/span> handleFile(e) {\n      <span class=\"hljs-keyword\">this<\/span>.file = e.target.files&#91;<span class=\"hljs-number\">0<\/span>];\n    },\n  },\n};\n<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><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>When the file is submitted we trigger the <code>submit<\/code> method which uploads the file to Cloudinary. It makes use of the <code>readData<\/code> method used to read the file contents and return them for upload.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\">\/\/ pages\/index.vue\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span>&gt;<\/span><span class=\"javascript\">\n<span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> {\n  <span class=\"hljs-attr\">name<\/span>: <span class=\"hljs-string\">'IndexPage'<\/span>,\n  data(){\n    <span class=\"hljs-keyword\">return<\/span> {\n        ...\n        uploading:<span class=\"hljs-literal\">false<\/span>,\n        <span class=\"hljs-attr\">cloudinaryFile<\/span>:<span class=\"hljs-literal\">null<\/span>,\n    };\n  },\n  <span class=\"hljs-attr\">methods<\/span>:{\n    ...\n    async readData(f) {\n      <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">Promise<\/span>(<span class=\"hljs-function\">(<span class=\"hljs-params\">resolve<\/span>) =&gt;<\/span> {\n        <span class=\"hljs-keyword\">const<\/span> reader = <span class=\"hljs-keyword\">new<\/span> FileReader();\n        reader.onloadend = <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> resolve(reader.result);\n        reader.readAsDataURL(f);\n      });\n    },\n    <span class=\"hljs-keyword\">async<\/span> upload() {\n      <span class=\"hljs-keyword\">this<\/span>.uploading = <span class=\"hljs-literal\">true<\/span>;\n      <span class=\"hljs-keyword\">const<\/span> fileData = <span class=\"hljs-keyword\">await<\/span> <span class=\"hljs-keyword\">this<\/span>.readData(<span class=\"hljs-keyword\">this<\/span>.file);\n      <span class=\"hljs-keyword\">this<\/span>.cloudinaryFile = <span class=\"hljs-keyword\">await<\/span> <span class=\"hljs-keyword\">this<\/span>.$cloudinary.upload(fileData, {\n        <span class=\"hljs-attr\">upload_preset<\/span>: <span class=\"hljs-string\">\"default-preset\"<\/span>,\n        <span class=\"hljs-attr\">folder<\/span>: <span class=\"hljs-string\">\"nuxtjs-photoshop-preview\"<\/span>,\n      });\n      <span class=\"hljs-keyword\">this<\/span>.uploading = <span class=\"hljs-literal\">false<\/span>;\n      <span class=\"hljs-keyword\">this<\/span>.getLayers();\n    }\n  }\n}\n<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\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\">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>The above code snippet refers to the <code>default-preset<\/code> upload preset. Upload presets are a pre-configured set of options that will be applied to our uploads. They are required for client-side unsecured uploads. To create an upload preset proceed to <a href=\"https:\/\/cloudinary.com\/console\/lui\/upload_presets\/new\">add upload preset<\/a> page. We recommend using the following settings.<\/p>\n<blockquote>\n<p>Name: <code>default-preset<\/code>\nMode: <code>unsigned<\/code>\nUnique filename: <code>true<\/code>\nDelivery type: <code>upload<\/code>\nAccess mode: <code>public<\/code><\/p>\n<\/blockquote>\n<h1>Getting the photoshop file layers<\/h1>\n<p>As visible in the above code snippet, once the upload is complete, a <code>getLayers<\/code>. This is the method we use to get the layers from the photoshop file as images. We do this by accessing <code>pages<\/code> of the image until there are no other pages to show. We then add all the <code>pages<\/code> into an images array as they are images of different layers.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\">\/\/ pages\/index.vue\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span>&gt;<\/span><span class=\"javascript\">\n<span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> {\n  <span class=\"hljs-attr\">name<\/span>: <span class=\"hljs-string\">'IndexPage'<\/span>,\n  data(){\n    <span class=\"hljs-keyword\">return<\/span> {\n      ...\n      images:&#91;]\n    };\n  },\n  <span class=\"hljs-attr\">methods<\/span>:{\n    ...\n    async getLayers(){\n      <span class=\"hljs-keyword\">this<\/span>.images = &#91;];\n      <span class=\"hljs-keyword\">let<\/span> count = <span class=\"hljs-number\">0<\/span>;\n      <span class=\"hljs-keyword\">let<\/span> resp;\n      <span class=\"hljs-keyword\">do<\/span>{\n        count++;\n        <span class=\"hljs-keyword\">let<\/span> url =  <span class=\"hljs-keyword\">this<\/span>.$cloudinary.image.url(\n          <span class=\"hljs-string\">`<span class=\"hljs-subst\">${<span class=\"hljs-keyword\">this<\/span>.cloudinaryFile.public_id}<\/span>.jpg`<\/span>,\n          {<span class=\"hljs-attr\">page<\/span>:count}\n        );\n        resp = <span class=\"hljs-keyword\">await<\/span> fetch(url);\n        <span class=\"hljs-keyword\">if<\/span>(resp.ok){\n          <span class=\"hljs-keyword\">this<\/span>.images.push(url);\n        }\n      }<span class=\"hljs-keyword\">while<\/span>(resp.ok);\n      <span class=\"hljs-built_in\">console<\/span>.log(<span class=\"hljs-keyword\">this<\/span>.images);\n    }\n  }\n}\n<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><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<h1>Displaying the photoshop file layers<\/h1>\n<p>Once all the layers are in the <code>images<\/code> array, we can now iterate the array and display them in our user interface.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\"><span class=\"hljs-comment\">&lt;!-- pages\/index.vue --&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">template<\/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\">div<\/span> <span class=\"hljs-attr\">v-for<\/span>=<span class=\"hljs-string\">\"image in images\"<\/span> <span class=\"hljs-attr\">:key<\/span>=<span class=\"hljs-string\">\"image\"<\/span> &gt;<\/span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">img<\/span> <span class=\"hljs-attr\">:src<\/span>=<span class=\"hljs-string\">\"image\"<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"m-auto\"<\/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  ...\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">template<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><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<h1>Conclusion<\/h1>\n<p>Through this project, we are now able to upload and preview all the layers of a photoshop file. To read more about what we can do with photoshop files, feel free to read the documentation on <a href=\"https:\/\/cloudinary.com\/documentation\/paged_and_layered_media#delivering_photoshop_images\">delivering photoshop images<\/a>.<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":41,"featured_media":27946,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[134,370,372,371],"class_list":["post-27945","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-guest-post","tag-image","tag-nuxtjs","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>Previewing Photoshop File Content in a NuxtJS App<\/title>\n<meta name=\"description\" content=\"Working with PSD files can be complex as they are not natively supported by HTML. However, it is a widely used format globally by creators and professionals in various fields. Let us learn how we can preview the photoshop file and its content for our users.\" \/>\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\/previewing-photoshop-file-content-in-a-nuxt-js-app\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Previewing Photoshop File Content in a NuxtJS App\" \/>\n<meta property=\"og:description\" content=\"Working with PSD files can be complex as they are not natively supported by HTML. However, it is a widely used format globally by creators and professionals in various fields. Let us learn how we can preview the photoshop file and its content for our users.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/guest_post\/previewing-photoshop-file-content-in-a-nuxt-js-app\/\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2022-02-08T21:18:16+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-12-19T20:28:11+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1681925832\/Web_Assets\/blog\/0160542966e213e342de276f2ec04a8750b17522-688x387-1_27946e421d\/0160542966e213e342de276f2ec04a8750b17522-688x387-1_27946e421d-jpg?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"688\" \/>\n\t<meta property=\"og:image:height\" content=\"387\" \/>\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\/previewing-photoshop-file-content-in-a-nuxt-js-app\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/previewing-photoshop-file-content-in-a-nuxt-js-app\/\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Previewing Photoshop File Content in a NuxtJS App\",\"datePublished\":\"2022-02-08T21:18:16+00:00\",\"dateModified\":\"2023-12-19T20:28:11+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/previewing-photoshop-file-content-in-a-nuxt-js-app\/\"},\"wordCount\":8,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/previewing-photoshop-file-content-in-a-nuxt-js-app\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925832\/Web_Assets\/blog\/0160542966e213e342de276f2ec04a8750b17522-688x387-1_27946e421d\/0160542966e213e342de276f2ec04a8750b17522-688x387-1_27946e421d.jpg?_i=AA\",\"keywords\":[\"Guest Post\",\"Image\",\"NuxtJS\",\"Under Review\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2022\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/previewing-photoshop-file-content-in-a-nuxt-js-app\/\",\"url\":\"https:\/\/cloudinary.com\/blog\/guest_post\/previewing-photoshop-file-content-in-a-nuxt-js-app\/\",\"name\":\"Previewing Photoshop File Content in a NuxtJS App\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/previewing-photoshop-file-content-in-a-nuxt-js-app\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/previewing-photoshop-file-content-in-a-nuxt-js-app\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925832\/Web_Assets\/blog\/0160542966e213e342de276f2ec04a8750b17522-688x387-1_27946e421d\/0160542966e213e342de276f2ec04a8750b17522-688x387-1_27946e421d.jpg?_i=AA\",\"datePublished\":\"2022-02-08T21:18:16+00:00\",\"dateModified\":\"2023-12-19T20:28:11+00:00\",\"description\":\"Working with PSD files can be complex as they are not natively supported by HTML. However, it is a widely used format globally by creators and professionals in various fields. Let us learn how we can preview the photoshop file and its content for our users.\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/previewing-photoshop-file-content-in-a-nuxt-js-app\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/guest_post\/previewing-photoshop-file-content-in-a-nuxt-js-app\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/previewing-photoshop-file-content-in-a-nuxt-js-app\/#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925832\/Web_Assets\/blog\/0160542966e213e342de276f2ec04a8750b17522-688x387-1_27946e421d\/0160542966e213e342de276f2ec04a8750b17522-688x387-1_27946e421d.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925832\/Web_Assets\/blog\/0160542966e213e342de276f2ec04a8750b17522-688x387-1_27946e421d\/0160542966e213e342de276f2ec04a8750b17522-688x387-1_27946e421d.jpg?_i=AA\",\"width\":688,\"height\":387},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/guest_post\/previewing-photoshop-file-content-in-a-nuxt-js-app\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Previewing Photoshop File Content in a NuxtJS App\"}]},{\"@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":"Previewing Photoshop File Content in a NuxtJS App","description":"Working with PSD files can be complex as they are not natively supported by HTML. However, it is a widely used format globally by creators and professionals in various fields. Let us learn how we can preview the photoshop file and its content for our users.","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\/previewing-photoshop-file-content-in-a-nuxt-js-app\/","og_locale":"en_US","og_type":"article","og_title":"Previewing Photoshop File Content in a NuxtJS App","og_description":"Working with PSD files can be complex as they are not natively supported by HTML. However, it is a widely used format globally by creators and professionals in various fields. Let us learn how we can preview the photoshop file and its content for our users.","og_url":"https:\/\/cloudinary.com\/blog\/guest_post\/previewing-photoshop-file-content-in-a-nuxt-js-app\/","og_site_name":"Cloudinary Blog","article_published_time":"2022-02-08T21:18:16+00:00","article_modified_time":"2023-12-19T20:28:11+00:00","og_image":[{"width":688,"height":387,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1681925832\/Web_Assets\/blog\/0160542966e213e342de276f2ec04a8750b17522-688x387-1_27946e421d\/0160542966e213e342de276f2ec04a8750b17522-688x387-1_27946e421d-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\/previewing-photoshop-file-content-in-a-nuxt-js-app\/#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/previewing-photoshop-file-content-in-a-nuxt-js-app\/"},"author":{"name":"","@id":""},"headline":"Previewing Photoshop File Content in a NuxtJS App","datePublished":"2022-02-08T21:18:16+00:00","dateModified":"2023-12-19T20:28:11+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/previewing-photoshop-file-content-in-a-nuxt-js-app\/"},"wordCount":8,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/previewing-photoshop-file-content-in-a-nuxt-js-app\/#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925832\/Web_Assets\/blog\/0160542966e213e342de276f2ec04a8750b17522-688x387-1_27946e421d\/0160542966e213e342de276f2ec04a8750b17522-688x387-1_27946e421d.jpg?_i=AA","keywords":["Guest Post","Image","NuxtJS","Under Review"],"inLanguage":"en-US","copyrightYear":"2022","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/guest_post\/previewing-photoshop-file-content-in-a-nuxt-js-app\/","url":"https:\/\/cloudinary.com\/blog\/guest_post\/previewing-photoshop-file-content-in-a-nuxt-js-app\/","name":"Previewing Photoshop File Content in a NuxtJS App","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/previewing-photoshop-file-content-in-a-nuxt-js-app\/#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/previewing-photoshop-file-content-in-a-nuxt-js-app\/#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925832\/Web_Assets\/blog\/0160542966e213e342de276f2ec04a8750b17522-688x387-1_27946e421d\/0160542966e213e342de276f2ec04a8750b17522-688x387-1_27946e421d.jpg?_i=AA","datePublished":"2022-02-08T21:18:16+00:00","dateModified":"2023-12-19T20:28:11+00:00","description":"Working with PSD files can be complex as they are not natively supported by HTML. However, it is a widely used format globally by creators and professionals in various fields. Let us learn how we can preview the photoshop file and its content for our users.","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/guest_post\/previewing-photoshop-file-content-in-a-nuxt-js-app\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/guest_post\/previewing-photoshop-file-content-in-a-nuxt-js-app\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/guest_post\/previewing-photoshop-file-content-in-a-nuxt-js-app\/#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925832\/Web_Assets\/blog\/0160542966e213e342de276f2ec04a8750b17522-688x387-1_27946e421d\/0160542966e213e342de276f2ec04a8750b17522-688x387-1_27946e421d.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1681925832\/Web_Assets\/blog\/0160542966e213e342de276f2ec04a8750b17522-688x387-1_27946e421d\/0160542966e213e342de276f2ec04a8750b17522-688x387-1_27946e421d.jpg?_i=AA","width":688,"height":387},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/guest_post\/previewing-photoshop-file-content-in-a-nuxt-js-app\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Previewing Photoshop File Content in a NuxtJS App"}]},{"@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\/v1681925832\/Web_Assets\/blog\/0160542966e213e342de276f2ec04a8750b17522-688x387-1_27946e421d\/0160542966e213e342de276f2ec04a8750b17522-688x387-1_27946e421d.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/27945","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=27945"}],"version-history":[{"count":2,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/27945\/revisions"}],"predecessor-version":[{"id":32267,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/27945\/revisions\/32267"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/27946"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=27945"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=27945"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=27945"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}