{"id":91964,"date":"2025-01-09T00:51:53","date_gmt":"2025-01-08T21:21:53","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/master-secure-file-uploads-to-aws-s3-in-nodejs-with-express-and-multer-4j3e\/"},"modified":"2025-01-09T00:51:53","modified_gmt":"2025-01-08T21:21:53","slug":"master-secure-file-uploads-to-aws-s3-in-nodejs-with-express-and-multer-4j3e","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/master-secure-file-uploads-to-aws-s3-in-nodejs-with-express-and-multer-4j3e\/","title":{"rendered":"\u0622\u067e\u0644\u0648\u062f \u0627\u0635\u0644\u06cc \u0641\u0627\u06cc\u0644 \u0627\u0645\u0646 \u0628\u0647 AWS S3 \u062f\u0631 Node.js \u0628\u0627 Express \u0648 Multer"},"content":{"rendered":"<div data-article-id=\"2193689\" id=\"article-body\">\n<p>\u0622\u067e\u0644\u0648\u062f \u0641\u0627\u06cc\u0644 \u0647\u0627 \u0628\u0647 \u0635\u0648\u0631\u062a \u0627\u06cc\u0645\u0646 \u0628\u062e\u0634 \u06a9\u0644\u06cc\u062f\u06cc \u062d\u0641\u0627\u0638\u062a \u0627\u0632 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u062f\u0631 \u0647\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0628 \u0627\u0633\u062a. \u062f\u0631 \u0627\u06cc\u0646 \u0648\u0628\u0644\u0627\u06af\u060c \u0634\u0645\u0627 \u0631\u0627 \u0628\u0627 \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0633\u06cc\u0633\u062a\u0645 \u0622\u067e\u0644\u0648\u062f \u0641\u0627\u06cc\u0644 \u0627\u0645\u0646 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Node.js\u060c Express\u060c Multer \u0648 AWS S3 \u0631\u0627\u0647\u0646\u0645\u0627\u06cc\u06cc \u0645\u06cc \u06a9\u0646\u06cc\u0645. \u0628\u0631\u0627\u06cc \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0627\u0632 \u0627\u06cc\u0645\u0646 \u0628\u0648\u062f\u0646 \u0622\u067e\u0644\u0648\u062f\u0647\u0627\u06cc \u0634\u0645\u0627 \u0648 \u0627\u06cc\u0645\u0646 \u0645\u0627\u0646\u062f\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627\u060c \u0631\u0648\u06cc \u0628\u0647\u062a\u0631\u06cc\u0646 \u0634\u06cc\u0648\u0647 \u0647\u0627 \u062a\u0645\u0631\u06a9\u0632 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f. \u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627 \u0628\u0631\u0627\u06cc \u0645\u0628\u062a\u062f\u06cc\u0627\u0646\u06cc \u06a9\u0647 \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u0646\u062f \u06cc\u0627\u062f \u0628\u06af\u06cc\u0631\u0646\u062f \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u0628\u0627 \u0622\u067e\u0644\u0648\u062f \u0641\u0627\u06cc\u0644\u200c\u0647\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u0646\u062f \u0648 \u0627\u0645\u0646\u06cc\u062a \u0631\u0627 \u062f\u0631 \u0627\u0648\u0644\u0648\u06cc\u062a \u0642\u0631\u0627\u0631 \u062f\u0647\u0646\u062f\u060c \u0639\u0627\u0644\u06cc \u0627\u0633\u062a.<\/p>\n<p>\u062d\u0627\u0644\u0627 \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0634\u06cc\u0631\u062c\u0647 \u0628\u0632\u0646\u06cc\u0645<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_84 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/master-secure-file-uploads-to-aws-s3-in-nodejs-with-express-and-multer-4j3e\/#%D9%BE%DB%8C%D8%B4_%D9%86%DB%8C%D8%A7%D8%B2%D9%87%D8%A7\" >\u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632\u0647\u0627<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/master-secure-file-uploads-to-aws-s3-in-nodejs-with-express-and-multer-4j3e\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_1_%D8%AA%D9%86%D8%B8%DB%8C%D9%85_%D9%85%D8%AD%DB%8C%D8%B7\" >\u0645\u0631\u062d\u0644\u0647 1: \u062a\u0646\u0638\u06cc\u0645 \u0645\u062d\u06cc\u0637<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/master-secure-file-uploads-to-aws-s3-in-nodejs-with-express-and-multer-4j3e\/#1_Nodejs_%D9%88_npm_%D8%B1%D8%A7_%D9%86%D8%B5%D8%A8_%DA%A9%D9%86%DB%8C%D8%AF\" >1. Node.js \u0648 npm \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f:<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/nabfollower.com\/blog\/master-secure-file-uploads-to-aws-s3-in-nodejs-with-express-and-multer-4j3e\/#2_AWS_CLI_%D8%B1%D8%A7_%D9%86%D8%B5%D8%A8_%DA%A9%D9%86%DB%8C%D8%AF\" >2. AWS CLI \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f:<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/nabfollower.com\/blog\/master-secure-file-uploads-to-aws-s3-in-nodejs-with-express-and-multer-4j3e\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_2_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_Nodejs_%D8%B1%D8%A7_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\" >\u0645\u0631\u062d\u0644\u0647 2: \u0628\u0631\u0646\u0627\u0645\u0647 Node.js \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/nabfollower.com\/blog\/master-secure-file-uploads-to-aws-s3-in-nodejs-with-express-and-multer-4j3e\/#1_%DB%8C%DA%A9_%D9%BE%D8%B1%D9%88%DA%98%D9%87_Nodejs_%D8%AC%D8%AF%DB%8C%D8%AF_%D8%B1%D8%A7_%D8%B1%D8%A7%D9%87_%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C_%DA%A9%D9%86%DB%8C%D8%AF\" >1. \u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 Node.js \u062c\u062f\u06cc\u062f \u0631\u0627 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f:<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/nabfollower.com\/blog\/master-secure-file-uploads-to-aws-s3-in-nodejs-with-express-and-multer-4j3e\/#2_%D8%A8%D8%B3%D8%AA%D9%87_%D9%87%D8%A7%DB%8C_%D9%84%D8%A7%D8%B2%D9%85_%D8%B1%D8%A7_%D9%86%D8%B5%D8%A8_%DA%A9%D9%86%DB%8C%D8%AF\" >2. \u0628\u0633\u062a\u0647 \u0647\u0627\u06cc \u0644\u0627\u0632\u0645 \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f:<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/nabfollower.com\/blog\/master-secure-file-uploads-to-aws-s3-in-nodejs-with-express-and-multer-4j3e\/#3_%D9%81%D8%A7%DB%8C%D9%84_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_%D8%B1%D8%A7_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF_appjs\" >3. \u0641\u0627\u06cc\u0644 \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f (app.js):<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/nabfollower.com\/blog\/master-secure-file-uploads-to-aws-s3-in-nodejs-with-express-and-multer-4j3e\/#4_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DB%8C%DA%A9_env_%D9%81%D8%A7%DB%8C%D9%84_%D8%A8%D8%B1%D8%A7%DB%8C_%D9%85%D8%AA%D8%BA%DB%8C%D8%B1%D9%87%D8%A7%DB%8C_%D9%85%D8%AD%DB%8C%D8%B7%DB%8C\" >4. \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 .env \u0641\u0627\u06cc\u0644 \u0628\u0631\u0627\u06cc \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0645\u062d\u06cc\u0637\u06cc:<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/nabfollower.com\/blog\/master-secure-file-uploads-to-aws-s3-in-nodejs-with-express-and-multer-4j3e\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_3_%D9%82%D8%A7%D9%84%D8%A8_CloudFormation_%D8%B1%D8%A7_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\" >\u0645\u0631\u062d\u0644\u0647 3: \u0642\u0627\u0644\u0628 CloudFormation \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/nabfollower.com\/blog\/master-secure-file-uploads-to-aws-s3-in-nodejs-with-express-and-multer-4j3e\/#1_%D9%81%D8%A7%DB%8C%D9%84%DB%8C_%D8%A8%D9%87_%D9%86%D8%A7%D9%85_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF_s3-file-uploadyml_%D9%88_%D9%85%D8%B7%D8%A7%D9%84%D8%A8_%D8%B2%DB%8C%D8%B1_%D8%B1%D8%A7_%D8%A7%D8%B6%D8%A7%D9%81%D9%87_%DA%A9%D9%86%DB%8C%D8%AF\" >1. \u0641\u0627\u06cc\u0644\u06cc \u0628\u0647 \u0646\u0627\u0645 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f s3-file-upload.yml \u0648 \u0645\u0637\u0627\u0644\u0628 \u0632\u06cc\u0631 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/nabfollower.com\/blog\/master-secure-file-uploads-to-aws-s3-in-nodejs-with-express-and-multer-4j3e\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_4_%D8%A7%D8%B3%D8%AA%D9%82%D8%B1%D8%A7%D8%B1_%D9%85%D9%86%D8%A7%D8%A8%D8%B9_AWS_%D8%A8%D8%A7_CloudFormation\" >\u0645\u0631\u062d\u0644\u0647 4: \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0645\u0646\u0627\u0628\u0639 AWS \u0628\u0627 CloudFormation<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/nabfollower.com\/blog\/master-secure-file-uploads-to-aws-s3-in-nodejs-with-express-and-multer-4j3e\/#1_%D8%A7%D8%B3%D8%AA%D9%82%D8%B1%D8%A7%D8%B1_%D9%BE%D8%B4%D8%AA%D9%87\" >1. \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u067e\u0634\u062a\u0647:<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/nabfollower.com\/blog\/master-secure-file-uploads-to-aws-s3-in-nodejs-with-express-and-multer-4j3e\/#2_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%D8%B3%D8%B7%D9%84_S3_%D8%B1%D8%A7_%D8%AA%D8%A3%DB%8C%DB%8C%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\" >2. \u0627\u06cc\u062c\u0627\u062f \u0633\u0637\u0644 S3 \u0631\u0627 \u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u06cc\u062f:<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/nabfollower.com\/blog\/master-secure-file-uploads-to-aws-s3-in-nodejs-with-express-and-multer-4j3e\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_5_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_Nodejs_%D8%AE%D9%88%D8%AF_%D8%B1%D8%A7_%D8%A7%D8%AC%D8%B1%D8%A7_%DA%A9%D9%86%DB%8C%D8%AF\" >\u0645\u0631\u062d\u0644\u0647 5: \u0628\u0631\u0646\u0627\u0645\u0647 Node.js \u062e\u0648\u062f \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/nabfollower.com\/blog\/master-secure-file-uploads-to-aws-s3-in-nodejs-with-express-and-multer-4j3e\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_6_%DB%8C%DA%A9_%D9%81%D8%A7%DB%8C%D9%84_%D8%A2%D9%BE%D9%84%D9%88%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\" >\u0645\u0631\u062d\u0644\u0647 6: \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u0622\u067e\u0644\u0648\u062f \u06a9\u0646\u06cc\u062f<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/nabfollower.com\/blog\/master-secure-file-uploads-to-aws-s3-in-nodejs-with-express-and-multer-4j3e\/#1_%D8%A7%D8%B2_Postman_%DB%8C%D8%A7_cURL_%D8%A8%D8%B1%D8%A7%DB%8C_%D8%A7%D8%B1%D8%B3%D8%A7%D9%84_%D8%AF%D8%B1%D8%AE%D9%88%D8%A7%D8%B3%D8%AA_POST_%D8%A8%D9%87_%D8%A2%D9%86_%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87_%DA%A9%D9%86%DB%8C%D8%AF_http_localhost_3000upload_%D8%A8%D8%A7_%DB%8C%DA%A9_%D9%81%D8%A7%DB%8C%D9%84\" >1. \u0627\u0632 Postman \u06cc\u0627 cURL \u0628\u0631\u0627\u06cc \u0627\u0631\u0633\u0627\u0644 \u062f\u0631\u062e\u0648\u0627\u0633\u062a POST \u0628\u0647 \u0622\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f http:\/\/localhost:3000\/upload \u0628\u0627 \u06cc\u06a9 \u0641\u0627\u06cc\u0644<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/nabfollower.com\/blog\/master-secure-file-uploads-to-aws-s3-in-nodejs-with-express-and-multer-4j3e\/#2_%D8%A2%D8%AF%D8%B1%D8%B3_%D9%81%D8%A7%DB%8C%D9%84_%D8%B1%D8%A7_%D8%AF%D8%B1_%D9%BE%D8%A7%D8%B3%D8%AE_%D8%AF%D8%B1%DB%8C%D8%A7%D9%81%D8%AA_%DA%A9%D9%86%DB%8C%D8%AF_%DA%A9%D9%87_%D9%86%D8%B4%D8%A7%D9%86_%D8%AF%D9%87%D9%86%D8%AF%D9%87_%D8%A2%D9%BE%D9%84%D9%88%D8%AF_%D9%85%D9%88%D9%81%D9%82%DB%8C%D8%AA_%D8%A2%D9%85%DB%8C%D8%B2_%D8%A7%D8%B3%D8%AA_%D9%BE%D8%A7%D8%B3%D8%AE_%D8%AF%D8%B1_%D9%82%D8%A7%D9%84%D8%A8_%D8%B2%DB%8C%D8%B1_%D8%AE%D9%88%D8%A7%D9%87%D8%AF_%D8%A8%D9%88%D8%AF\" >2. \u0622\u062f\u0631\u0633 \u0641\u0627\u06cc\u0644 \u0631\u0627 \u062f\u0631 \u067e\u0627\u0633\u062e \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0646\u0634\u0627\u0646 \u062f\u0647\u0646\u062f\u0647 \u0622\u067e\u0644\u0648\u062f \u0645\u0648\u0641\u0642\u06cc\u062a \u0622\u0645\u06cc\u0632 \u0627\u0633\u062a. \u067e\u0627\u0633\u062e \u062f\u0631 \u0642\u0627\u0644\u0628 \u0632\u06cc\u0631 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f.<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/nabfollower.com\/blog\/master-secure-file-uploads-to-aws-s3-in-nodejs-with-express-and-multer-4j3e\/#%D9%86%D8%AA%DB%8C%D8%AC%D9%87_%DA%AF%DB%8C%D8%B1%DB%8C\" >\u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc<\/a><\/li><\/ul><\/nav><\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D9%BE%DB%8C%D8%B4_%D9%86%DB%8C%D8%A7%D8%B2%D9%87%D8%A7\"><\/span>\n<p>  \u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632\u0647\u0627<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>\u062f\u0627\u0646\u0634 \u0627\u0648\u0644\u06cc\u0647 Node.js\/Javascript<\/li>\n<li>\u062f\u0627\u0646\u0634 \u0627\u0648\u0644\u06cc\u0647 AWS \u0648 CloudFormation\n<\/li>\n<li>\u062d\u0633\u0627\u0628 AWS. \u06cc\u06a9\u06cc \u0631\u0627 \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0628\u0647 \u0635\u0648\u0631\u062a \u0631\u0627\u06cc\u06af\u0627\u0646 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/li>\n<li>\u0635\u0628\u0631 <\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_1_%D8%AA%D9%86%D8%B8%DB%8C%D9%85_%D9%85%D8%AD%DB%8C%D8%B7\"><\/span>\n<p>  \u0645\u0631\u062d\u0644\u0647 1: \u062a\u0646\u0638\u06cc\u0645 \u0645\u062d\u06cc\u0637<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<h4><span class=\"ez-toc-section\" id=\"1_Nodejs_%D9%88_npm_%D8%B1%D8%A7_%D9%86%D8%B5%D8%A8_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  1. Node.js \u0648 npm \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f:<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<ul>\n<li>Node.js \u0631\u0627 \u0627\u0632 nodejs.org \u062f\u0627\u0646\u0644\u0648\u062f \u0648 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f.<\/li>\n<li>\u062a\u0623\u06cc\u06cc\u062f \u0646\u0635\u0628:\n<\/li>\n<\/ul>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"nv\">$ <\/span>node <span class=\"nt\">-v<\/span>\n<span class=\"c\">#v20.18.1<\/span>\n<span class=\"nv\">$ <\/span>npm <span class=\"nt\">-v<\/span>\n<span class=\"c\">#10.8.2<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h4><span class=\"ez-toc-section\" id=\"2_AWS_CLI_%D8%B1%D8%A7_%D9%86%D8%B5%D8%A8_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  2. AWS CLI \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f:<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<ul>\n<li>AWS CLI \u0631\u0627 \u0627\u0632 aws.amazon.com\/cli \u062f\u0627\u0646\u0644\u0648\u062f \u0648 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f.<\/li>\n<li>AWS CLI \u0631\u0627 \u0628\u0627 \u0627\u0639\u062a\u0628\u0627\u0631 \u062e\u0648\u062f \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u06a9\u0646\u06cc\u062f:\n<\/li>\n<\/ul>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"nv\">$ <\/span>aws configure\n<span class=\"c\">#AWS Access Key ID [****************H53C]: <\/span>\n<span class=\"c\">#AWS Secret Access Key [****************1CcY]: <\/span>\n<span class=\"c\">#Default region name [us-east-1]: <\/span>\n<span class=\"c\">#Default output format [json]:<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_2_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_Nodejs_%D8%B1%D8%A7_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \u0645\u0631\u062d\u0644\u0647 2: \u0628\u0631\u0646\u0627\u0645\u0647 Node.js \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<h4><span class=\"ez-toc-section\" id=\"1_%DB%8C%DA%A9_%D9%BE%D8%B1%D9%88%DA%98%D9%87_Nodejs_%D8%AC%D8%AF%DB%8C%D8%AF_%D8%B1%D8%A7_%D8%B1%D8%A7%D9%87_%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  1. \u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 Node.js \u062c\u062f\u06cc\u062f \u0631\u0627 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f:<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">mkdir <\/span>node-file-upload-api\n<span class=\"nv\">$ <\/span><span class=\"nb\">cd <\/span>node-file-upload-api\n<span class=\"nv\">$ <\/span>npm init <span class=\"nt\">-y<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h4><span class=\"ez-toc-section\" id=\"2_%D8%A8%D8%B3%D8%AA%D9%87_%D9%87%D8%A7%DB%8C_%D9%84%D8%A7%D8%B2%D9%85_%D8%B1%D8%A7_%D9%86%D8%B5%D8%A8_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  2. \u0628\u0633\u062a\u0647 \u0647\u0627\u06cc \u0644\u0627\u0632\u0645 \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f:<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"nv\">$ <\/span>npm <span class=\"nb\">install <\/span>express aws-sdk multer dotenv uuid\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h4><span class=\"ez-toc-section\" id=\"3_%D9%81%D8%A7%DB%8C%D9%84_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_%D8%B1%D8%A7_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF_appjs\"><\/span>\n<p>  3. \u0641\u0627\u06cc\u0644 \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f (<code>app.js<\/code>):<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<ul>\n<li>\u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 <code>app.js<\/code> \u0641\u0627\u06cc\u0644<\/li>\n<li>\u06a9\u062f \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0632\u06cc\u0631 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f<\/li>\n<li>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0645\u0627 \u062f\u0631 \u062d\u0627\u0644 \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u062a\u0627\u0628\u0639 \u0628\u0631\u0627\u06cc \u0627\u0631\u0633\u0627\u0644 \u06cc\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a POST \u0628\u0631\u0627\u06cc \u0622\u067e\u0644\u0648\u062f \u0641\u0627\u06cc\u0644 \u0645\u0627 \u0648 \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 URL presigned \u0628\u0631\u0627\u06cc \u0641\u0627\u06cc\u0644 \u0622\u067e\u0644\u0648\u062f \u0634\u062f\u0647 \u0647\u0633\u062a\u06cc\u0645.\n<\/li>\n<\/ul>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"c1\">\/\/ app.js<\/span>\n<span class=\"c1\">\/\/ Import the required packages<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">express<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">require<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">express<\/span><span class=\"dl\">'<\/span><span class=\"p\">);<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">multer<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">require<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">multer<\/span><span class=\"dl\">'<\/span><span class=\"p\">);<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">AWS<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">require<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">aws-sdk<\/span><span class=\"dl\">'<\/span><span class=\"p\">);<\/span>\n<span class=\"kd\">const<\/span> <span class=\"p\">{<\/span> <span class=\"na\">v4<\/span><span class=\"p\">:<\/span> <span class=\"nx\">uuidv4<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">require<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">uuid<\/span><span class=\"dl\">'<\/span><span class=\"p\">);<\/span>\n\n<span class=\"c1\">\/\/ Load environment variables from a .env file<\/span>\n<span class=\"nf\">require<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">dotenv<\/span><span class=\"dl\">'<\/span><span class=\"p\">).<\/span><span class=\"nf\">config<\/span><span class=\"p\">();<\/span>\n\n<span class=\"c1\">\/\/ Create an Express application<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">app<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">express<\/span><span class=\"p\">();<\/span>\n\n<span class=\"c1\">\/\/ Create an S3 instance with the specified region<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">s3<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">AWS<\/span><span class=\"p\">.<\/span><span class=\"nc\">S3<\/span><span class=\"p\">({<\/span> <span class=\"na\">region<\/span><span class=\"p\">:<\/span> <span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">AWS_REGION<\/span> <span class=\"p\">});<\/span>\n\n<span class=\"c1\">\/\/ Configure Multer to save uploaded files to the 'uploads\/' directory<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">upload<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">multer<\/span><span class=\"p\">({<\/span> <span class=\"na\">dest<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">uploads\/<\/span><span class=\"dl\">'<\/span> <span class=\"p\">});<\/span>\n\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">post<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">\/upload<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">upload<\/span><span class=\"p\">.<\/span><span class=\"nf\">single<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">file<\/span><span class=\"dl\">'<\/span><span class=\"p\">),<\/span> <span class=\"p\">(<\/span><span class=\"nx\">req<\/span><span class=\"p\">,<\/span> <span class=\"nx\">res<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"c1\">\/\/ Get the uploaded file from the request<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">file<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">req<\/span><span class=\"p\">.<\/span><span class=\"nx\">file<\/span><span class=\"p\">;<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">fileKey<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">`<\/span><span class=\"p\">${<\/span><span class=\"nf\">uuidv4<\/span><span class=\"p\">()}<\/span><span class=\"s2\">-<\/span><span class=\"p\">${<\/span><span class=\"nx\">file<\/span><span class=\"p\">.<\/span><span class=\"nx\">originalname<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"kd\">const<\/span> <span class=\"nx\">s3Params<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">Bucket<\/span><span class=\"p\">:<\/span> <span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">S3_BUCKET<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">Key<\/span><span class=\"p\">:<\/span> <span class=\"nx\">fileKey<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">Body<\/span><span class=\"p\">:<\/span> <span class=\"nf\">require<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">fs<\/span><span class=\"dl\">'<\/span><span class=\"p\">).<\/span><span class=\"nf\">createReadStream<\/span><span class=\"p\">(<\/span><span class=\"nx\">file<\/span><span class=\"p\">.<\/span><span class=\"nx\">path<\/span><span class=\"p\">),<\/span> <span class=\"c1\">\/\/ Create a readable stream from the uploaded file<\/span>\n        <span class=\"na\">ContentType<\/span><span class=\"p\">:<\/span> <span class=\"nx\">file<\/span><span class=\"p\">.<\/span><span class=\"nx\">mimetype<\/span>\n    <span class=\"p\">};<\/span>\n\n    <span class=\"nx\">s3<\/span><span class=\"p\">.<\/span><span class=\"nf\">upload<\/span><span class=\"p\">(<\/span><span class=\"nx\">s3Params<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">,<\/span> <span class=\"nx\">data<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n            <span class=\"k\">return<\/span> <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nf\">status<\/span><span class=\"p\">(<\/span><span class=\"mi\">500<\/span><span class=\"p\">).<\/span><span class=\"nf\">send<\/span><span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">);<\/span>\n        <span class=\"p\">}<\/span>\n\n        <span class=\"c1\">\/\/ Generate presigned URL<\/span>\n        <span class=\"kd\">const<\/span> <span class=\"nx\">presignedUrlParams<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n            <span class=\"na\">Bucket<\/span><span class=\"p\">:<\/span> <span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">S3_BUCKET<\/span><span class=\"p\">,<\/span>\n            <span class=\"na\">Key<\/span><span class=\"p\">:<\/span> <span class=\"nx\">fileKey<\/span><span class=\"p\">,<\/span>\n            <span class=\"na\">Expires<\/span><span class=\"p\">:<\/span> <span class=\"mi\">60<\/span> <span class=\"o\">*<\/span> <span class=\"mi\">60<\/span> <span class=\"c1\">\/\/ URL expiration time in seconds (e.g., 1 hour)<\/span>\n        <span class=\"p\">};<\/span>\n\n        <span class=\"nx\">s3<\/span><span class=\"p\">.<\/span><span class=\"nf\">getSignedUrl<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">getObject<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">presignedUrlParams<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">,<\/span> <span class=\"nx\">presignedUrl<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n            <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n                <span class=\"k\">return<\/span> <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nf\">status<\/span><span class=\"p\">(<\/span><span class=\"mi\">500<\/span><span class=\"p\">).<\/span><span class=\"nf\">send<\/span><span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">);<\/span>\n            <span class=\"p\">}<\/span>\n\n            <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nf\">status<\/span><span class=\"p\">(<\/span><span class=\"mi\">200<\/span><span class=\"p\">).<\/span><span class=\"nf\">send<\/span><span class=\"p\">({<\/span>\n                <span class=\"na\">message<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">File uploaded successfully<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n                <span class=\"na\">url<\/span><span class=\"p\">:<\/span> <span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">Location<\/span><span class=\"p\">,<\/span>\n                <span class=\"na\">presignedUrl<\/span><span class=\"p\">:<\/span> <span class=\"nx\">presignedUrl<\/span>\n            <span class=\"p\">});<\/span>\n        <span class=\"p\">});<\/span>\n    <span class=\"p\">});<\/span>\n<span class=\"p\">});<\/span>\n\n<span class=\"c1\">\/\/ Start the server on port 3000<\/span>\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">listen<\/span><span class=\"p\">(<\/span><span class=\"mi\">3000<\/span><span class=\"p\">,<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">log<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">Server running on port 3000<\/span><span class=\"dl\">'<\/span><span class=\"p\">);<\/span>\n<span class=\"p\">});<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h4><span class=\"ez-toc-section\" id=\"4_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DB%8C%DA%A9_env_%D9%81%D8%A7%DB%8C%D9%84_%D8%A8%D8%B1%D8%A7%DB%8C_%D9%85%D8%AA%D8%BA%DB%8C%D8%B1%D9%87%D8%A7%DB%8C_%D9%85%D8%AD%DB%8C%D8%B7%DB%8C\"><\/span>\n<p>  4. \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 <code>.env<\/code> \u0641\u0627\u06cc\u0644 \u0628\u0631\u0627\u06cc \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0645\u062d\u06cc\u0637\u06cc:<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<ul>\n<li>\u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 <code>.env<\/code> \u0641\u0627\u06cc\u0644<\/li>\n<li>\u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0632\u06cc\u0631 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f\n<\/li>\n<\/ul>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>AWS_REGION=us-east-1\nS3_BUCKET=my-node-app-bucket-382c-c803-a96a-49f1\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<ul>\n<li>\u0645\u0637\u0645\u0626\u0646 \u0634\u0648\u06cc\u062f \u06a9\u0647 \u0646\u0627\u0645 \u0633\u0637\u0644 \u0634\u0645\u0627 \u0645\u0646\u062d\u0635\u0631 \u0628\u0647 \u0641\u0631\u062f \u0627\u0633\u062a. \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 Online UUID Generator \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 UUID \u0645\u0646\u062d\u0635\u0631\u0628\u0647\u200c\u0641\u0631\u062f \u0628\u0631\u0627\u06cc \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u0628\u0647 \u0646\u0627\u0645 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_3_%D9%82%D8%A7%D9%84%D8%A8_CloudFormation_%D8%B1%D8%A7_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \u0645\u0631\u062d\u0644\u0647 3: \u0642\u0627\u0644\u0628 CloudFormation \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<h4><span class=\"ez-toc-section\" id=\"1_%D9%81%D8%A7%DB%8C%D9%84%DB%8C_%D8%A8%D9%87_%D9%86%D8%A7%D9%85_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF_s3-file-uploadyml_%D9%88_%D9%85%D8%B7%D8%A7%D9%84%D8%A8_%D8%B2%DB%8C%D8%B1_%D8%B1%D8%A7_%D8%A7%D8%B6%D8%A7%D9%81%D9%87_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  1. \u0641\u0627\u06cc\u0644\u06cc \u0628\u0647 \u0646\u0627\u0645 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f <code>s3-file-upload.yml<\/code> \u0648 \u0645\u0637\u0627\u0644\u0628 \u0632\u06cc\u0631 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<ul>\n<li>\u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 <code>s3-file-upload.yml<\/code> \u0641\u0627\u06cc\u0644<\/li>\n<li>\u06a9\u062f \u0632\u06cc\u0631 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f\n<\/li>\n<\/ul>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight yaml\"><code><span class=\"na\">AWSTemplateFormatVersion<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">2010-09-09\"<\/span>\n\n<span class=\"na\">Resources<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">S3Bucket<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">Type<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">AWS::S3::Bucket\"<\/span> <span class=\"c1\"># Defines an S3 bucket resource<\/span>\n    <span class=\"na\">Properties<\/span><span class=\"pi\">:<\/span>\n      <span class=\"na\">BucketName<\/span><span class=\"pi\">:<\/span> <span class=\"kt\">!Sub<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">my-node-app-bucket-382c-c803-a96a-49f1\"<\/span> <span class=\"c1\"># Sets the bucket name<\/span>\n      <span class=\"na\">PublicAccessBlockConfiguration<\/span><span class=\"pi\">:<\/span> <span class=\"c1\"># Configures public access settings for the bucket<\/span>\n        <span class=\"na\">BlockPublicAcls<\/span><span class=\"pi\">:<\/span> <span class=\"kc\">true<\/span> <span class=\"c1\"># Blocks public ACLs<\/span>\n        <span class=\"na\">BlockPublicPolicy<\/span><span class=\"pi\">:<\/span> <span class=\"kc\">false<\/span> <span class=\"c1\"># Allows custom bucket policies<\/span>\n        <span class=\"na\">IgnorePublicAcls<\/span><span class=\"pi\">:<\/span> <span class=\"kc\">true<\/span> <span class=\"c1\"># Ignores public ACLs<\/span>\n        <span class=\"na\">RestrictPublicBuckets<\/span><span class=\"pi\">:<\/span> <span class=\"kc\">true<\/span> <span class=\"c1\"># Restricts public bucket access<\/span>\n      <span class=\"na\">VersioningConfiguration<\/span><span class=\"pi\">:<\/span>\n        <span class=\"na\">Status<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Enabled<\/span> <span class=\"c1\"># Enables versioning for the bucket<\/span>\n\n  <span class=\"na\">S3BucketPolicy<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">Type<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">AWS::S3::BucketPolicy\"<\/span> <span class=\"c1\"># Defines a bucket policy resource<\/span>\n    <span class=\"na\">Properties<\/span><span class=\"pi\">:<\/span>\n      <span class=\"na\">Bucket<\/span><span class=\"pi\">:<\/span> <span class=\"kt\">!Ref<\/span> <span class=\"s\">S3Bucket<\/span> <span class=\"c1\"># References the S3 bucket created above<\/span>\n      <span class=\"na\">PolicyDocument<\/span><span class=\"pi\">:<\/span>\n        <span class=\"na\">Version<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">2012-10-17\"<\/span> <span class=\"c1\"># Specifies the version of the policy language<\/span>\n        <span class=\"na\">Statement<\/span><span class=\"pi\">:<\/span>\n          <span class=\"pi\">-<\/span> <span class=\"na\">Effect<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Allow<\/span> <span class=\"c1\"># Allows the specified actions<\/span>\n            <span class=\"na\">Principal<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">*\"<\/span> <span class=\"c1\"># Applies to all principals (users)<\/span>\n            <span class=\"na\">Action<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">s3:GetObject\"<\/span> <span class=\"c1\"># Allows the GetObject action<\/span>\n            <span class=\"na\">Resource<\/span><span class=\"pi\">:<\/span> <span class=\"kt\">!Sub<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">${S3Bucket.Arn}\/*\"<\/span> <span class=\"c1\"># Applies to all objects in the bucket<\/span>\n            <span class=\"na\">Condition<\/span><span class=\"pi\">:<\/span>\n              <span class=\"na\">Bool<\/span><span class=\"pi\">:<\/span>\n                <span class=\"na\">aws:SecureTransport<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">true\"<\/span> <span class=\"c1\"># Requires requests to use HTTPS<\/span>\n          <span class=\"pi\">-<\/span> <span class=\"na\">Effect<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Allow<\/span> <span class=\"c1\"># Allows the specified actions<\/span>\n            <span class=\"na\">Principal<\/span><span class=\"pi\">:<\/span>\n              <span class=\"na\">AWS<\/span><span class=\"pi\">:<\/span> <span class=\"kt\">!Sub<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">arn:aws:iam::${AWS::AccountId}:role\/MyAppRole\"<\/span> <span class=\"c1\"># Allows the IAM role to access the bucket<\/span>\n            <span class=\"na\">Action<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">s3:PutObject\"<\/span> <span class=\"c1\"># Allows the PutObject action<\/span>\n            <span class=\"na\">Resource<\/span><span class=\"pi\">:<\/span> <span class=\"kt\">!Sub<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">${S3Bucket.Arn}\/*\"<\/span> <span class=\"c1\"># Applies to all objects in the bucket<\/span>\n\n  <span class=\"na\">MyAppIAMRole<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">Type<\/span><span class=\"pi\">:<\/span> <span class=\"s\">AWS::IAM::Role<\/span> <span class=\"c1\"># Defines an IAM Role resource<\/span>\n    <span class=\"na\">Properties<\/span><span class=\"pi\">:<\/span>\n      <span class=\"na\">RoleName<\/span><span class=\"pi\">:<\/span> <span class=\"s\">MyAppRole<\/span> <span class=\"c1\"># Assigns a name to the IAM role<\/span>\n      <span class=\"na\">AssumeRolePolicyDocument<\/span><span class=\"pi\">:<\/span>\n        <span class=\"na\">Version<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">2012-10-17\"<\/span> <span class=\"c1\"># Specifies the version of the policy language<\/span>\n        <span class=\"na\">Statement<\/span><span class=\"pi\">:<\/span>\n          <span class=\"pi\">-<\/span> <span class=\"na\">Effect<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Allow<\/span> <span class=\"c1\"># Allows the following action<\/span>\n            <span class=\"na\">Principal<\/span><span class=\"pi\">:<\/span>\n              <span class=\"na\">Service<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">ec2.amazonaws.com\"<\/span> <span class=\"c1\"># Specifies that the EC2 service can assume this role<\/span>\n            <span class=\"na\">Action<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">sts:AssumeRole\"<\/span> <span class=\"c1\"># Allows EC2 instances to assume the role<\/span>\n      <span class=\"na\">Policies<\/span><span class=\"pi\">:<\/span>\n        <span class=\"pi\">-<\/span> <span class=\"na\">PolicyName<\/span><span class=\"pi\">:<\/span> <span class=\"s\">S3AccessPolicy<\/span> <span class=\"c1\"># Names the inline policy for the role<\/span>\n          <span class=\"na\">PolicyDocument<\/span><span class=\"pi\">:<\/span>\n            <span class=\"na\">Version<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">2012-10-17\"<\/span> <span class=\"c1\"># Specifies the version of the policy language<\/span>\n            <span class=\"na\">Statement<\/span><span class=\"pi\">:<\/span>\n              <span class=\"pi\">-<\/span> <span class=\"na\">Effect<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Allow<\/span> <span class=\"c1\"># Allows the following actions<\/span>\n                <span class=\"na\">Action<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">s3:PutObject\"<\/span> <span class=\"c1\"># Grants permission to upload objects to S3<\/span>\n                <span class=\"na\">Resource<\/span><span class=\"pi\">:<\/span> <span class=\"kt\">!Sub<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">${S3Bucket.Arn}\/*\"<\/span> <span class=\"c1\"># Applies to all objects in the specified S3 bucket<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<ul>\n<li>\u062f\u0631 \u0642\u0627\u0644\u0628 CloudFormation \u0641\u0648\u0642\u060c \u0645\u0627 \u062f\u0631 \u062d\u0627\u0644 \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0633\u0637\u0644 S3 \u0628\u0627 \u0646\u0627\u0645\u06cc \u0647\u0633\u062a\u06cc\u0645 \u06a9\u0647 \u0634\u0627\u0645\u0644 \u0634\u0646\u0627\u0633\u0647 \u062d\u0633\u0627\u0628 AWS \u0645\u06cc \u0634\u0648\u062f \u062a\u0627 \u0622\u0646 \u0631\u0627 \u0645\u0646\u062d\u0635\u0631 \u0628\u0647 \u0641\u0631\u062f \u06a9\u0646\u062f. \u062a\u0645\u0627\u0645 \u062f\u0633\u062a\u0631\u0633\u06cc \u0647\u0627\u06cc \u0639\u0645\u0648\u0645\u06cc \u0631\u0627 \u0645\u0633\u062f\u0648\u062f \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0646\u0633\u062e\u0647 \u0633\u0627\u0632\u06cc \u0631\u0627 \u0641\u0639\u0627\u0644 \u0645\u06cc \u06a9\u0646\u062f. \u0627\u06cc\u0646 \u0627\u0644\u06af\u0648 \u0647\u0645\u0686\u0646\u06cc\u0646 \u062e\u0637\u200c\u0645\u0634\u06cc \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc\u200c\u06a9\u0646\u062f \u06a9\u0647 \u0628\u0647 \u0647\u0631 \u06a9\u0633\u06cc \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc\u200c\u062f\u0647\u062f \u0627\u0634\u06cc\u0627\u0621 \u0631\u0627 \u0627\u0632 \u0633\u0637\u0644 \u0628\u0627\u0631\u06af\u06cc\u0631\u06cc \u06a9\u0646\u062f\u060c \u0627\u0645\u0627 \u0641\u0642\u0637 \u0627\u0632 \u0637\u0631\u06cc\u0642 HTTPS \u0628\u0631\u0627\u06cc \u0627\u0646\u062a\u0642\u0627\u0644 \u0627\u0645\u0646 \u062f\u0627\u062f\u0647\u200c\u0647\u0627.<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_4_%D8%A7%D8%B3%D8%AA%D9%82%D8%B1%D8%A7%D8%B1_%D9%85%D9%86%D8%A7%D8%A8%D8%B9_AWS_%D8%A8%D8%A7_CloudFormation\"><\/span>\n<p>  \u0645\u0631\u062d\u0644\u0647 4: \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0645\u0646\u0627\u0628\u0639 AWS \u0628\u0627 CloudFormation<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<h4><span class=\"ez-toc-section\" id=\"1_%D8%A7%D8%B3%D8%AA%D9%82%D8%B1%D8%A7%D8%B1_%D9%BE%D8%B4%D8%AA%D9%87\"><\/span>\n<p>  1. \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u067e\u0634\u062a\u0647:<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<ul>\n<li>\u0645\u0627 \u0627\u06a9\u0646\u0648\u0646 \u067e\u0634\u062a\u0647 AWS CloudFormation \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0641\u0627\u06cc\u0644 \u0642\u0627\u0644\u0628\u06cc \u06a9\u0647 \u062f\u0631 \u0628\u0627\u0644\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0631\u062f\u06cc\u0645\u060c \u0645\u0633\u062a\u0642\u0631 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f.\n<\/li>\n<\/ul>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"nv\">$ <\/span>aws cloudformation deploy <span class=\"nt\">--template-file<\/span> s3-file-upload.yml <span class=\"nt\">--stack-name<\/span> S3FileUploadStack <span class=\"nt\">--capabilities<\/span> CAPABILITY_NAMED_IAM\n<span class=\"c\">#Waiting for changeset to be created..<\/span>\n<span class=\"c\">#Waiting for stack create\/update to complete<\/span>\n<span class=\"c\">#Successfully created\/updated stack - S3FileUploadStack<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<ul>\n<li>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0628\u0647 \u062a\u0641\u06a9\u06cc\u06a9 \u0647\u0631 \u0628\u062e\u0634 \u0645\u06cc \u067e\u0631\u062f\u0627\u0632\u06cc\u0645:<\/li>\n<\/ul>\n<p><code>aws cloudformation deploy<\/code>: \u0627\u06cc\u0646 \u062f\u0633\u062a\u0648\u0631 AWS CLI \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u06cc\u06a9 \u067e\u0634\u062a\u0647 CloudFormation \u0627\u0633\u062a.<br \/><code>--template-file s3-file-upload.yml<\/code>: \u0645\u0633\u06cc\u0631 \u0641\u0627\u06cc\u0644 \u0642\u0627\u0644\u0628 CloudFormation (s3-file-upload.yml) \u0631\u0627 \u0645\u0634\u062e\u0635 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0645\u0646\u0627\u0628\u0639 \u0648 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc \u06a9\u0646\u062f.<br \/><code>--stack-name S3FileUploadStack<\/code>: \u0646\u0627\u0645 \u067e\u0634\u062a\u0647 CloudFormation \u0631\u0627 \u0631\u0648\u06cc S3FileUploadStack \u0642\u0631\u0627\u0631 \u0645\u06cc \u062f\u0647\u062f.<br \/><code>--capabilities CAPABILITY_NAMED_IAM<\/code>: \u062a\u0635\u062f\u06cc\u0642 \u0645\u06cc\u200c\u06a9\u0646\u062f \u06a9\u0647 \u067e\u0634\u062a\u0647 \u0628\u0647 \u0645\u0646\u0627\u0628\u0639 IAM \u0628\u0627 \u0646\u0627\u0645\u200c\u0647\u0627\u06cc \u0633\u0641\u0627\u0631\u0634\u06cc \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u062f\u060c \u06a9\u0647 \u0628\u0647 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc\u200c\u062f\u0647\u062f \u0646\u0642\u0634\u200c\u0647\u0627 \u0648 \u062e\u0637\u200c\u0645\u0634\u06cc\u200c\u0647\u0627\u06cc IAM \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06cc\u0627 \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0647\u062f.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"2_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%D8%B3%D8%B7%D9%84_S3_%D8%B1%D8%A7_%D8%AA%D8%A3%DB%8C%DB%8C%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  2. \u0627\u06cc\u062c\u0627\u062f \u0633\u0637\u0644 S3 \u0631\u0627 \u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u06cc\u062f:<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<ul>\n<li>\u067e\u0633 \u0627\u0632 \u0627\u0633\u062a\u0642\u0631\u0627\u0631\u060c \u0648\u0627\u0631\u062f \u06a9\u0646\u0633\u0648\u0644 AWS \u062e\u0648\u062f \u0634\u0648\u06cc\u062f \u0648 \u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0633\u0637\u0644 S3 \u0627\u0632 \u067e\u0634\u062a\u0647 CloudFormation \u062a\u0647\u06cc\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a.<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_5_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_Nodejs_%D8%AE%D9%88%D8%AF_%D8%B1%D8%A7_%D8%A7%D8%AC%D8%B1%D8%A7_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \u0645\u0631\u062d\u0644\u0647 5: \u0628\u0631\u0646\u0627\u0645\u0647 Node.js \u062e\u0648\u062f \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>\u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0645\u062d\u06cc\u0637\u06cc \u0631\u0627 \u062f\u0631 \u0641\u0627\u06cc\u0644 .env \u0628\u0627 \u0646\u0627\u0645 \u0633\u0637\u0644 S3 \u062f\u0631\u0633\u062a \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0631\u062f\u0647 \u0627\u06cc\u062f.<\/li>\n<li>\u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u0634\u0631\u0648\u0639 \u06a9\u0646\u06cc\u062f:\n<\/li>\n<\/ul>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"nv\">$ <\/span>node app.js\n<span class=\"c\">#Server running on port 3000<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_6_%DB%8C%DA%A9_%D9%81%D8%A7%DB%8C%D9%84_%D8%A2%D9%BE%D9%84%D9%88%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \u0645\u0631\u062d\u0644\u0647 6: \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u0622\u067e\u0644\u0648\u062f \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<h4><span class=\"ez-toc-section\" id=\"1_%D8%A7%D8%B2_Postman_%DB%8C%D8%A7_cURL_%D8%A8%D8%B1%D8%A7%DB%8C_%D8%A7%D8%B1%D8%B3%D8%A7%D9%84_%D8%AF%D8%B1%D8%AE%D9%88%D8%A7%D8%B3%D8%AA_POST_%D8%A8%D9%87_%D8%A2%D9%86_%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87_%DA%A9%D9%86%DB%8C%D8%AF_http_localhost_3000upload_%D8%A8%D8%A7_%DB%8C%DA%A9_%D9%81%D8%A7%DB%8C%D9%84\"><\/span>\n<p>  1. \u0627\u0632 Postman \u06cc\u0627 cURL \u0628\u0631\u0627\u06cc \u0627\u0631\u0633\u0627\u0644 \u062f\u0631\u062e\u0648\u0627\u0633\u062a POST \u0628\u0647 \u0622\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f <code>http:\/\/localhost:3000\/upload<\/code> \u0628\u0627 \u06cc\u06a9 \u0641\u0627\u06cc\u0644<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p><em><strong>\u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u067e\u0633\u062a\u0686\u06cc<\/strong><\/em><\/p>\n<ul>\n<li>\u06cc\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a POST \u062c\u062f\u06cc\u062f \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f.<\/li>\n<li>URL \u0631\u0627 \u0631\u0648\u06cc http:\/\/localhost:3000\/upload \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f.<\/li>\n<li>\u062f\u0631 \u0628\u0631\u06af\u0647 &#8220;Body&#8221;\u060c &#8220;form-data&#8221; \u0631\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0646\u06cc\u062f\u060c \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u06a9\u0644\u06cc\u062f\u06cc \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f \u0648 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0622\u067e\u0644\u0648\u062f \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0646\u06cc\u062f.<br \/>\n\n<\/li>\n<\/ul>\n<p><em><strong>\u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Curl<\/strong><\/em><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"nv\">$ <\/span>curl <span class=\"nt\">-F<\/span> <span class=\"s2\">\"file=@\/tmp\/files\/test-upload.png\"<\/span> http:\/\/localhost:3000\/upload\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h4><span class=\"ez-toc-section\" id=\"2_%D8%A2%D8%AF%D8%B1%D8%B3_%D9%81%D8%A7%DB%8C%D9%84_%D8%B1%D8%A7_%D8%AF%D8%B1_%D9%BE%D8%A7%D8%B3%D8%AE_%D8%AF%D8%B1%DB%8C%D8%A7%D9%81%D8%AA_%DA%A9%D9%86%DB%8C%D8%AF_%DA%A9%D9%87_%D9%86%D8%B4%D8%A7%D9%86_%D8%AF%D9%87%D9%86%D8%AF%D9%87_%D8%A2%D9%BE%D9%84%D9%88%D8%AF_%D9%85%D9%88%D9%81%D9%82%DB%8C%D8%AA_%D8%A2%D9%85%DB%8C%D8%B2_%D8%A7%D8%B3%D8%AA_%D9%BE%D8%A7%D8%B3%D8%AE_%D8%AF%D8%B1_%D9%82%D8%A7%D9%84%D8%A8_%D8%B2%DB%8C%D8%B1_%D8%AE%D9%88%D8%A7%D9%87%D8%AF_%D8%A8%D9%88%D8%AF\"><\/span>\n<p>  2. \u0622\u062f\u0631\u0633 \u0641\u0627\u06cc\u0644 \u0631\u0627 \u062f\u0631 \u067e\u0627\u0633\u062e \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0646\u0634\u0627\u0646 \u062f\u0647\u0646\u062f\u0647 \u0622\u067e\u0644\u0648\u062f \u0645\u0648\u0641\u0642\u06cc\u062a \u0622\u0645\u06cc\u0632 \u0627\u0633\u062a. \u067e\u0627\u0633\u062e \u062f\u0631 \u0642\u0627\u0644\u0628 \u0632\u06cc\u0631 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f.<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight json\"><code><span class=\"p\">{<\/span><span class=\"w\">\n    <\/span><span class=\"nl\">\"message\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"File uploaded successfully\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"nl\">\"url\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"https:\/\/my-node-app-bucket-382c-c803-a96a-49f1.s3.amazonaws.com\/87587526-e70b-451d-a405-ceab366016a8-test-upload.png\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"nl\">\"presignedUrl\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"https:\/\/my-node-app-bucket-382c-c803-a96a-49f1.s3.amazonaws.com\/87587526-e70b-451d-a405-ceab366016a8-test-upload.png?AWSAccessKeyId=AKIATA6LX4GWXV6MH53C&amp;Expires=1736370100&amp;Signature=66dKUQRW%2F47La3MPPngITEhFE%2FA%3D\"<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D9%86%D8%AA%DB%8C%D8%AC%D9%87_%DA%AF%DB%8C%D8%B1%DB%8C\"><\/span>\n<p>  \u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u062f\u0631 \u062e\u0627\u062a\u0645\u0647\u060c \u062a\u0633\u0644\u0637 \u0628\u0631 \u0622\u067e\u0644\u0648\u062f\u0647\u0627\u06cc \u0627\u0645\u0646 \u0641\u0627\u06cc\u0644 \u062f\u0631 AWS S3 \u062f\u0631 Node.js \u0628\u0627 Express \u0648 Multer \u0641\u0631\u0627\u062a\u0631 \u0627\u0632 \u0639\u0645\u0644\u06a9\u0631\u062f\u0647\u0627\u06cc \u0627\u0648\u0644\u06cc\u0647 \u0627\u0633\u062a \u2013 \u0646\u06cc\u0627\u0632 \u0628\u0647 \u062a\u0645\u0631\u06a9\u0632 \u0642\u0648\u06cc \u0631\u0648\u06cc \u0627\u0645\u0646\u06cc\u062a \u062f\u0627\u0631\u062f. \u0628\u0627 \u0627\u062f\u063a\u0627\u0645 Multer \u0628\u0631\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0627\u0631\u0622\u0645\u062f \u0641\u0627\u06cc\u0644\u060c \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0648\u06cc\u0698\u06af\u06cc\u200c\u0647\u0627\u06cc \u0627\u0645\u0646\u06cc\u062a\u06cc \u0642\u0648\u06cc AWS S3 \u0645\u0627\u0646\u0646\u062f \u062e\u0637\u200c\u0645\u0634\u06cc\u200c\u0647\u0627\u06cc \u0633\u0637\u0644 \u0648 \u0646\u0634\u0627\u0646\u06cc\u200c\u0647\u0627\u06cc \u0627\u06cc\u0646\u062a\u0631\u0646\u062a\u06cc \u062a\u0639\u06cc\u06cc\u0646\u200c\u0634\u062f\u0647\u060c \u0648 \u0627\u062c\u0631\u0627\u06cc \u0627\u062a\u0635\u0627\u0644\u0627\u062a HTTPS\u060c \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062d\u0627\u0635\u0644 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u0622\u067e\u0644\u0648\u062f \u0634\u062f\u0647 \u0628\u0647\u200c\u0637\u0648\u0631 \u0627\u06cc\u0645\u0646 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0648 \u0642\u0627\u0628\u0644 \u062f\u0633\u062a\u0631\u0633\u06cc \u0647\u0633\u062a\u0646\u062f. \u0627\u06cc\u0646 \u0631\u0648\u06cc\u06a9\u0631\u062f \u0646\u0647 \u062a\u0646\u0647\u0627 \u0627\u0632 \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc \u062d\u0633\u0627\u0633 \u0645\u062d\u0627\u0641\u0638\u062a \u0645\u06cc\u200c\u06a9\u0646\u062f\u060c \u0628\u0644\u06a9\u0647 \u0628\u0647 \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0627\u0632 \u062f\u0633\u062a\u0631\u0633\u06cc \u063a\u06cc\u0631\u0645\u062c\u0627\u0632 \u0648 \u0622\u0633\u06cc\u0628\u200c\u067e\u0630\u06cc\u0631\u06cc\u200c\u0647\u0627\u06cc \u0627\u062d\u062a\u0645\u0627\u0644\u06cc \u06a9\u0645\u06a9 \u0645\u06cc\u200c\u06a9\u0646\u062f \u0648 \u0622\u0646 \u0631\u0627 \u0628\u0647 \u06cc\u06a9 \u0631\u0627\u0647\u200c\u062d\u0644 \u0645\u0637\u0645\u0626\u0646 \u0648 \u0627\u0645\u0646 \u0628\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc \u0648\u0628 \u0645\u062f\u0631\u0646 \u062a\u0628\u062f\u06cc\u0644 \u0645\u06cc\u200c\u06a9\u0646\u062f.<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u0622\u067e\u0644\u0648\u062f \u0641\u0627\u06cc\u0644 \u0647\u0627 \u0628\u0647 \u0635\u0648\u0631\u062a \u0627\u06cc\u0645\u0646 \u0628\u062e\u0634 \u06a9\u0644\u06cc\u062f\u06cc \u062d\u0641\u0627\u0638\u062a \u0627\u0632 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u062f\u0631 \u0647\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0628 \u0627\u0633\u062a. \u062f\u0631 \u0627\u06cc\u0646 \u0648\u0628\u0644\u0627\u06af\u060c \u0634\u0645\u0627 \u0631\u0627 \u0628\u0627 \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0633\u06cc\u0633\u062a\u0645 \u0622\u067e\u0644\u0648\u062f \u0641\u0627\u06cc\u0644 \u0627\u0645\u0646 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Node.js\u060c Express\u060c Multer \u0648 AWS S3 \u0631\u0627\u0647\u0646\u0645\u0627\u06cc\u06cc \u0645\u06cc \u06a9\u0646\u06cc\u0645. \u0628\u0631\u0627\u06cc \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0627\u0632 \u0627\u06cc\u0645\u0646 \u0628\u0648\u062f\u0646 \u0622\u067e\u0644\u0648\u062f\u0647\u0627\u06cc \u0634\u0645\u0627 \u0648 \u0627\u06cc\u0645\u0646 \u0645\u0627\u0646\u062f\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627\u060c \u0631\u0648\u06cc &hellip;<\/p>\n","protected":false},"author":2,"featured_media":91965,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-91964","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/91964","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=91964"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/91964\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/91965"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=91964"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=91964"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=91964"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}