{"id":4637,"date":"2017-01-15T14:01:04","date_gmt":"2017-01-15T12:01:04","guid":{"rendered":"https:\/\/www.tomislavstankovic.com\/blog\/?p=4637"},"modified":"2019-01-05T19:58:20","modified_gmt":"2019-01-05T17:58:20","slug":"node-js-restful-api-upload-datoteka","status":"publish","type":"post","link":"https:\/\/www.tomislavstankovic.com\/blog\/node-js-restful-api-upload-datoteka\/","title":{"rendered":"Node.js RESTful API za upload datoteka"},"content":{"rendered":"<p>Ovaj blog post je nastavak pro\u0161log u kojemu smo izradili jednostavan <a href=\"https:\/\/www.tomislavstankovic.com\/blog\/jednostavan-nodejs-expressjs-rest-api\/\" target=\"_blank\">RESTful API koriste\u0107i Node.js i Express.js<\/a>.<\/p>\n<p>Ondje smo imali tablicu sa korisnicima i upravljali jednostavnom formom s dva tekstualna polja tj. kroz API smo dodavali ime i prezime korisnika, ure\u0111ivali ih i brisali. U ovom primjeru API-ju \u0107emo dodati mogu\u0107nost dodavanja datoteka koje \u0107e se spremati na disk.<\/p>\n<p>Kako bi jednostavnije mogli pratiti sadr\u017eaj ovog blog posta <a href=\"https:\/\/github.com\/tomislavstankovic\/SImple-NodeJS-ExpressJS-Starter-API\" target=\"_blank\">preuzmite API iz pro\u0161log blog posta<\/a>.<\/p>\n<p>Po\u010detna struktura projekta:<\/p>\n<pre class=\"lang:default decode:true \" >| - KorisniciAPI\/\r\n     | - node_modules\/\r\n          | - body-parser\/\r\n          | - express\/\r\n          | - mysql\/\r\n     | - server.js\r\n     | - package.json<\/pre>\n<h2>Nadogradnja MySQL baze<\/h2>\n<p>Za po\u010detak \u0107emo dodati dva nova polja u bazu, <strong>k_slika<\/strong> i <strong>k_dokument<\/strong>, koja \u0107e nam slu\u017eiti za povezivanje datoteka s odre\u0111enim korisnikom. U oba polja \u0107e se spremati putanje do datoteka, iako sliku mo\u017eemo spremati i kao <em><a href=\"https:\/\/en.wikipedia.org\/wiki\/Base64\" target=\"_blank\">base64 string<\/a><\/em>, ali kako to nije najbolja praksa ne\u0107emo to raditi.<\/p>\n<p><a href=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/01\/korisnik-baza-datoteke.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/01\/korisnik-baza-datoteke.jpg\" alt=\"Polja za datoteke u bazi\" width=\"660\" height=\"123\" class=\"aligncenter size-full wp-image-4644\" srcset=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/01\/korisnik-baza-datoteke.jpg 660w, https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/01\/korisnik-baza-datoteke-300x56.jpg 300w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><\/a><\/p>\n<h2>multer middleware<\/h2>\n<p>Kako bi API razumio \u0161to mu \u017eelimo re\u0107i kada \u0161aljemo datoteke koristiti \u0107emo <a href=\"https:\/\/www.npmjs.com\/package\/multer\" target=\"_blank\"><strong>multer<\/strong> NPM paket<\/a>. Paketa s istom svrhom ima vi\u0161e nego dovoljno da mo\u017eete odabrati i neki drugi ako zaklju\u010dite da vam vi\u0161e odgovara. Koji god koristili princip je isti, a ti\u010de se <em><a href=\"https:\/\/www.w3.org\/TR\/html401\/interact\/forms.html#h-17.13.4.2\" target=\"_blank\">multipart\/form-data<\/a><\/em>.<\/p>\n<p>U mapi projekta instalirati \u0107emo novi paket pomo\u0107u naredbe  <span class=\"lang:sh decode:true  crayon-inline \" >$ npm install &#8211;save multer<\/span> <\/p>\n<p>Struktura projekta sada je bogatija za mapu <strong>multer<\/strong>:<\/p>\n<pre class=\"lang:default mark:5 decode:true \" > | - KorisniciAPI\/\r\n     | - node_modules\/\r\n          | - body-parser\/\r\n          | - express\/\r\n          | - multer\/\r\n          | - mysql\/\r\n     | - server.js\r\n     | - package.json<\/pre>\n<p>Kao i <strong>package.json<\/strong><\/p>\n<pre class=\"lang:default mark:4 decode:true \" >\"dependencies\": {\r\n    \"body-parser\": \"^1.15.2\",\r\n    \"express\": \"^4.14.0\",\r\n    \"multer\": \"^1.2.1\",\r\n    \"mysql\": \"^2.12.0\"\r\n  }<\/pre>\n<p>Me\u0111utim, na\u0161 API jo\u0161 uvijek ne mo\u017ee koristiti <strong>multer<\/strong>, barem dok ga ne navedemo u <strong>server.js<\/strong> \u0161to \u0107emo sada i u\u010diniti.<\/p>\n<h2>Server.js<\/h2>\n<p>U <strong>server.js<\/strong> dodajemo sljede\u0107e:<\/p>\n<pre class=\"lang:js decode:true \" >var multer  = require('multer')\r\nvar upload = multer({ dest: '\/uploads' })<\/pre>\n<p>Prva linija definira varijablu kojom pozivamo ranije dodani paket dok druga linija definira mapu u koju \u0107e se spremati datoteke koje budu dodane putem API-ja. Ta \u0107e se mapa stvoriti \u010dim sljede\u0107i put pokrenemo <strong>server.js<\/strong>, a nalazit \u0107e se unutar <em>root <\/em>mape <strong>KorisniciAPI<\/strong>.<\/p>\n<p><a href=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/01\/multer-uploads.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/01\/multer-uploads.gif\" alt=\"multer uploads datoteka\" width=\"1189\" height=\"613\" class=\"aligncenter size-full wp-image-4672\" \/><\/a><\/p>\n<h2>Dodavanje korisnika i upload datoteka<\/h2>\n<p>API za dodavanje korisnika sada \u0107e dobiti neke nove mogu\u0107nosti.<\/p>\n<pre class=\"lang:js mark:2,4-5,16-17 decode:true \" >\/\/Dodavanje korisnika\r\napiRoutes.post('\/dodajkorisnika', upload.any(),function (req, res, next) {\r\n\r\n  console.log(req.body);\r\n  console.log(req.files);\r\n\r\n   pool.getConnection(function(err, connection) {\r\n \r\n        if (err) {\r\n            console.error(\"Dogodila se gre\u0161ka: \" + err);\r\n        }\r\n\r\n            var korisnik = { \r\n            k_ime: req.body.ime,\r\n            k_prezime: req.body.prezime,\r\n\t    k_slika: req.files[0].destination + \"\/\" + req.files[0].filename,  \r\n\t    k_dokument: req.files[1].destination + \"\/\" + req.files[1].filename  \r\n            };      \r\n\t\t\t\r\n            connection.query('INSERT INTO korisnik SET ?', korisnik,\r\n            function(err, rows) {\r\n                if (err) {\r\n                    throw err;\r\n                } else {\r\n\t\t    res.json(\"Uspje\u0161no dodan korisnik!\");\r\n                    res.end();\r\n                }\r\n                connection.release();\r\n            });\r\n    });\r\n})<\/pre>\n<p>Sada \u0107emo pomo\u0107u <a href=\"https:\/\/www.getpostman.com\/apps\" target=\"_blank\">Postmana<\/a> dodati jednog korisnika, njegovu sliku i datoteku pa \u0107emo analizirati proces i rezultat. <\/p>\n<p><a href=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/01\/multer-upload-api-post.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/01\/multer-upload-api-post.gif\" alt=\"Multer upload datoteka\" width=\"1817\" height=\"971\" class=\"aligncenter size-full wp-image-4657\" \/><\/a><\/p>\n<p>Kao \u0161to se vidi iz gornje animacije, nakon \u0161to kliknemo na <em>Send <\/em>i po\u0161aljemo ime, prezime, sliku i datoteku korisnika sve se zapi\u0161e u bazu podataka u obliku stringa. <\/p>\n<p> <span class=\"lang:js decode:true  crayon-inline \" >console.log(req.body);<\/span>  i  <span class=\"lang:js decode:true  crayon-inline \" >console.log(req.files);<\/span>  daju nam vrlo korisne informacije. Kao prvo mo\u017eemo potvrditi da je sve \u0161to smo poslali putem <em>Postmana<\/em> i stiglo, a kao drugo mo\u017eemo vidjeti od \u010dega se sastoje na\u0161e datoteke i odlu\u010diti u kojem \u0107emo ih obliku spremati u bazu podataka. U ovom slu\u010daju koristimo  <span class=\"lang:sh decode:true  crayon-inline \" >destination<\/span>  i  <span class=\"lang:sh decode:true  crayon-inline \" >filename<\/span> .<\/p>\n<pre class=\"lang:sh mark:6-7,14-15 decode:true \" >{ ime: 'Tomislav', prezime: 'Stankovi\u0107' }\r\n[ { fieldname: 'slika',\r\n    originalname: 'tomislav-stankovic.jpg',\r\n    encoding: '7bit',\r\n    mimetype: 'image\/jpeg',\r\n    destination: '.\/uploads',\r\n    filename: '6527f85adbde49f692efd52449764547',\r\n    path: 'uploads\\\\6527f85adbde49f692efd52449764547',\r\n    size: '15402' },\r\n  { fieldname: 'dokument',\r\n    originalname: 'O-meni.docx',\r\n    encoding: '7bit',\r\n    mimetype: 'application\/vnd.openxmlformats-officedocument.wordprocessingml.document',\r\n    destination: '.\/uploads',\r\n    filename: 'ad6375db29809af74be25b2d8822f46f',\r\n    path: 'uploads\\\\ad6375db29809af74be25b2d8822f46f',\r\n    size: '12706' }]<\/pre>\n<p>Sliku tj. datoteku na <em>frontendu<\/em> mo\u017eemo prikazati u obliku:  <span class=\"lang:sh decode:true  crayon-inline \" >http:\/\/localhost:8080\/destination\/filename<\/span> <\/p>\n<p>I to je to \u0161to se dodavanja datoteka ti\u010de. Nakon \u0161to smo se uvjerili da API radi mo\u017eemo izraditi formu za unos sadr\u017eaja koju \u0107e koristiti korisnici.<\/p>\n<h2>Brisanje korisnika<\/h2>\n<p>Korisnika mo\u017eemo obrisati kori\u0161tenjem postoje\u0107eg API-ja. I kao \u0161to se vidi u <a href=\"https:\/\/www.tomislavstankovic.com\/blog\/jednostavan-nodejs-expressjs-rest-api\/\" target=\"_blank\">prethodnom blog postu<\/a> kada po\u0161aljemo ID korisnika sve vezano uz njega bri\u0161e se iz baze. Me\u0111utim ostaje jedan problem, a to su datoteke na disku koje nisu obrisane jer API-ju smo rekli da iz baze obri\u0161e samo korisnika s odre\u0111enim ID-em, ali API ne\u0107e i ne zna obrisati fizi\u010dke datoteke koje se nalaze na disku.<\/p>\n<pre class=\"lang:js decode:true \" >apiRoutes.delete('\/korisnik\/:k_id', function(req, res, next){\r\n\r\npool.getConnection(function(err, connection) {\r\n \r\n        if (err) {\r\n            console.error(\"Dogodila se gre\u0161ka: \" + err);\r\n        }\r\n            connection.query('delete from korisnik where k_id = ?', [req.params.k_id], \r\n            function(err, rows) {\r\n                if (err) {\r\n                    return next(err);\r\n                } else {\r\n                    res.writeHead(200, {\r\n                        \"Content-Type\": \"application\/json\"\r\n                    });\r\n                    var result = {\r\n                        success: true\r\n                    }\r\n                    res.write(JSON.stringify(result));\r\n                    res.end();\r\n                }\r\n            });\r\n    });\r\n});<\/pre>\n<h3>Brisanje datoteka s diska<\/h3>\n<p>Kako bi to bilo mogu\u0107e potrebno je koristiti <em><a href=\"https:\/\/nodejs.org\/api\/fs.html\" target=\"_blank\">Node File System<\/a> (fs)<\/em>. Na vrhu <strong>server.js<\/strong> definirat \u0107emo varijablu  <span class=\"lang:js decode:true  crayon-inline \" >var fs = require(&#8216;fs&#8217;);<\/span> <\/p>\n<p>API za brisanje korisnika sada izgleda ovako:<\/p>\n<pre class=\"lang:js mark:1,5-6,18-19 decode:true \" >apiRoutes.delete('\/korisnik\/:k_id\/:k_slika\/:k_dokument', function(req, res, next){\r\n\r\nconsole.log(req.params);\r\n\r\nvar slika =  req.params.k_slika;\r\nvar dokument =  req.params.k_dokument;\r\n\r\npool.getConnection(function(err, connection) {\r\n \r\n        if (err) {\r\n            console.error(\"Dogodila se gre\u0161ka: \" + err);\r\n        }\r\n            connection.query('delete from korisnik where k_id = ?', [req.params.k_id], \r\n            function(err, rows) {\r\n                if (err) {\r\n                    return next(err);\r\n                } else {\r\n\t\t\t\t    fs.unlinkSync('.\/uploads\/' + slika);\r\n\t\t\t\t\tfs.unlinkSync('.\/uploads\/' + dokument);\r\n                    res.writeHead(200, {\r\n                        \"Content-Type\": \"application\/json\"\r\n                    });\r\n                    var result = {\r\n                        success: true\r\n                    }\r\n                    res.write(JSON.stringify(result));\r\n                    res.end();\r\n                }\r\n            });\r\n    });\r\n});<\/pre>\n<p>Osim ID-ja korisnika sada \u0161aljemo jo\u0161 i naziv slike tj. naziv dokumenta <span class=\"lang:default decode:true  crayon-inline \" >http:\/\/localhost:8080\/api\/korisnik\/2\/6527f85adbde49f692efd52449764547\/ad6375db29809af74be25b2d8822f46f<\/span> tako da smo ta dva nova parametra morali navesti i unutar API-ja  <span class=\"lang:sh decode:true  crayon-inline \" >&#8216;\/korisnik\/:k_id\/:k_slika\/:k_dokument&#8217;<\/span>.<\/p>\n<p>Kada pokrenemo API dobijemo <span class=\"lang:sh decode:true  crayon-inline \" >console.log(req.params)<\/span>:<\/p>\n<pre class=\"lang:sh decode:true \" >\r\n{ k_id: '2',\r\n  k_slika: '6527f85adbde49f692efd52449764547',\r\n  k_dokument: 'ad6375db29809af74be25b2d8822f46f' }<\/pre>\n<p>i  <span class=\"lang:sh decode:true  crayon-inline \" >{ &#8220;success&#8221;: true }<\/span> <\/p>\n<p>Cijeli proces izgleda ovako:<\/p>\n<p><a href=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/01\/multer-delete-api.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/01\/multer-delete-api.gif\" alt=\"NodeJS brisanje datoteka\" width=\"1848\" height=\"706\" class=\"aligncenter size-full wp-image-4669\" \/><\/a><\/p>\n<h2>Zaklju\u010dak<\/h2>\n<p>Ovo je samo jedan od na\u010dina kako pomo\u0107u <em>NodeJS<\/em>-a napraviti <em>upload <\/em>i brisanje datoteka. <\/p>\n<p>Posjetite <strong><a href=\"https:\/\/github.com\/tomislavstankovic\/SImple-NodeJS-ExpressJS-Starter-API\/tree\/form-data\" target=\"_blank\">GitHub<\/a><\/strong> i preuzmite projekt.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ovaj blog post je nastavak pro\u0161log u kojemu smo izradili jednostavan RESTful API koriste\u0107i Node.js i Express.js. Ondje smo imali tablicu sa korisnicima i upravljali jednostavnom formom s dva tekstualna polja tj. kroz API smo dodavali ime i prezime korisnika, ure\u0111ivali ih i brisali. U ovom primjeru API-ju \u0107emo dodati mogu\u0107nost dodavanja datoteka koje \u0107e &hellip; <a href=\"https:\/\/www.tomislavstankovic.com\/blog\/node-js-restful-api-upload-datoteka\/\" class=\"more-link\">Nastavi \u010ditati <span class=\"screen-reader-text\">Node.js RESTful API za upload datoteka<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":4639,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[565,351],"tags":[376,375,380,378,377],"class_list":["post-4637","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-backend","category-razvoj","tag-api","tag-express-js","tag-form-data","tag-node-js","tag-rest"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Node.js RESTful API za upload datoteka - Tomislav Stankovi\u0107<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.tomislavstankovic.com\/blog\/node-js-restful-api-upload-datoteka\/\" \/>\n<meta property=\"og:locale\" content=\"hr_HR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Node.js RESTful API za upload datoteka - Tomislav Stankovi\u0107\" \/>\n<meta property=\"og:description\" content=\"Ovaj blog post je nastavak pro\u0161log u kojemu smo izradili jednostavan RESTful API koriste\u0107i Node.js i Express.js. Ondje smo imali tablicu sa korisnicima i upravljali jednostavnom formom s dva tekstualna polja tj. kroz API smo dodavali ime i prezime korisnika, ure\u0111ivali ih i brisali. U ovom primjeru API-ju \u0107emo dodati mogu\u0107nost dodavanja datoteka koje \u0107e &hellip; Nastavi \u010ditati Node.js RESTful API za upload datoteka\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.tomislavstankovic.com\/blog\/node-js-restful-api-upload-datoteka\/\" \/>\n<meta property=\"og:site_name\" content=\"Tomislav Stankovi\u0107\" \/>\n<meta property=\"article:published_time\" content=\"2017-01-15T12:01:04+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-01-05T17:58:20+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/01\/RESTful-API-with-PHP.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"825\" \/>\n\t<meta property=\"og:image:height\" content=\"510\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Tomislav Stankovi\u0107\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Napisao\/la\" \/>\n\t<meta name=\"twitter:data1\" content=\"Tomislav Stankovi\u0107\" \/>\n\t<meta name=\"twitter:label2\" content=\"Procijenjeno vrijeme \u010ditanja\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minuta\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/node-js-restful-api-upload-datoteka\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/node-js-restful-api-upload-datoteka\\\/\"},\"author\":{\"name\":\"Tomislav Stankovi\u0107\",\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/#\\\/schema\\\/person\\\/0329c549c57700034ea77f5d3d78396d\"},\"headline\":\"Node.js RESTful API za upload datoteka\",\"datePublished\":\"2017-01-15T12:01:04+00:00\",\"dateModified\":\"2019-01-05T17:58:20+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/node-js-restful-api-upload-datoteka\\\/\"},\"wordCount\":680,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/#\\\/schema\\\/person\\\/0329c549c57700034ea77f5d3d78396d\"},\"image\":{\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/node-js-restful-api-upload-datoteka\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/01\\\/RESTful-API-with-PHP.jpg\",\"keywords\":[\"API\",\"Express.js\",\"form-data\",\"Node.js\",\"REST\"],\"articleSection\":[\"Backend\",\"Razvoj\"],\"inLanguage\":\"hr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/node-js-restful-api-upload-datoteka\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/node-js-restful-api-upload-datoteka\\\/\",\"url\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/node-js-restful-api-upload-datoteka\\\/\",\"name\":\"Node.js RESTful API za upload datoteka - Tomislav Stankovi\u0107\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/node-js-restful-api-upload-datoteka\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/node-js-restful-api-upload-datoteka\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/01\\\/RESTful-API-with-PHP.jpg\",\"datePublished\":\"2017-01-15T12:01:04+00:00\",\"dateModified\":\"2019-01-05T17:58:20+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/node-js-restful-api-upload-datoteka\\\/#breadcrumb\"},\"inLanguage\":\"hr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/node-js-restful-api-upload-datoteka\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"hr\",\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/node-js-restful-api-upload-datoteka\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/01\\\/RESTful-API-with-PHP.jpg\",\"contentUrl\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/01\\\/RESTful-API-with-PHP.jpg\",\"width\":825,\"height\":510,\"caption\":\"Node.js RESTful API za upload datoteka\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/node-js-restful-api-upload-datoteka\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Po\u010detna stranica\",\"item\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Node.js RESTful API za upload datoteka\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/\",\"name\":\"Tomislav Stankovi\u0107\",\"description\":\"Sam svoj bloger\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/#\\\/schema\\\/person\\\/0329c549c57700034ea77f5d3d78396d\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"hr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/#\\\/schema\\\/person\\\/0329c549c57700034ea77f5d3d78396d\",\"name\":\"Tomislav Stankovi\u0107\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"hr\",\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/10\\\/cropped-TomislavStankovic.jpg\",\"url\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/10\\\/cropped-TomislavStankovic.jpg\",\"contentUrl\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/10\\\/cropped-TomislavStankovic.jpg\",\"width\":248,\"height\":165,\"caption\":\"Tomislav Stankovi\u0107\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/10\\\/cropped-TomislavStankovic.jpg\"},\"description\":\"Bloger \u0161irokog raspona interesa od kojih dio voli objaviti na ovom blogu. U neslobodno vrijeme Angular developer mobilnih i web aplikacija.\",\"sameAs\":[\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/tomislavstankovic\\\/\"],\"url\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/author\\\/tomislavstankovic\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Node.js RESTful API za upload datoteka - Tomislav Stankovi\u0107","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:\/\/www.tomislavstankovic.com\/blog\/node-js-restful-api-upload-datoteka\/","og_locale":"hr_HR","og_type":"article","og_title":"Node.js RESTful API za upload datoteka - Tomislav Stankovi\u0107","og_description":"Ovaj blog post je nastavak pro\u0161log u kojemu smo izradili jednostavan RESTful API koriste\u0107i Node.js i Express.js. Ondje smo imali tablicu sa korisnicima i upravljali jednostavnom formom s dva tekstualna polja tj. kroz API smo dodavali ime i prezime korisnika, ure\u0111ivali ih i brisali. U ovom primjeru API-ju \u0107emo dodati mogu\u0107nost dodavanja datoteka koje \u0107e &hellip; Nastavi \u010ditati Node.js RESTful API za upload datoteka","og_url":"https:\/\/www.tomislavstankovic.com\/blog\/node-js-restful-api-upload-datoteka\/","og_site_name":"Tomislav Stankovi\u0107","article_published_time":"2017-01-15T12:01:04+00:00","article_modified_time":"2019-01-05T17:58:20+00:00","og_image":[{"width":825,"height":510,"url":"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/01\/RESTful-API-with-PHP.jpg","type":"image\/jpeg"}],"author":"Tomislav Stankovi\u0107","twitter_card":"summary_large_image","twitter_misc":{"Napisao\/la":"Tomislav Stankovi\u0107","Procijenjeno vrijeme \u010ditanja":"5 minuta"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.tomislavstankovic.com\/blog\/node-js-restful-api-upload-datoteka\/#article","isPartOf":{"@id":"https:\/\/www.tomislavstankovic.com\/blog\/node-js-restful-api-upload-datoteka\/"},"author":{"name":"Tomislav Stankovi\u0107","@id":"https:\/\/www.tomislavstankovic.com\/blog\/#\/schema\/person\/0329c549c57700034ea77f5d3d78396d"},"headline":"Node.js RESTful API za upload datoteka","datePublished":"2017-01-15T12:01:04+00:00","dateModified":"2019-01-05T17:58:20+00:00","mainEntityOfPage":{"@id":"https:\/\/www.tomislavstankovic.com\/blog\/node-js-restful-api-upload-datoteka\/"},"wordCount":680,"commentCount":0,"publisher":{"@id":"https:\/\/www.tomislavstankovic.com\/blog\/#\/schema\/person\/0329c549c57700034ea77f5d3d78396d"},"image":{"@id":"https:\/\/www.tomislavstankovic.com\/blog\/node-js-restful-api-upload-datoteka\/#primaryimage"},"thumbnailUrl":"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/01\/RESTful-API-with-PHP.jpg","keywords":["API","Express.js","form-data","Node.js","REST"],"articleSection":["Backend","Razvoj"],"inLanguage":"hr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.tomislavstankovic.com\/blog\/node-js-restful-api-upload-datoteka\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.tomislavstankovic.com\/blog\/node-js-restful-api-upload-datoteka\/","url":"https:\/\/www.tomislavstankovic.com\/blog\/node-js-restful-api-upload-datoteka\/","name":"Node.js RESTful API za upload datoteka - Tomislav Stankovi\u0107","isPartOf":{"@id":"https:\/\/www.tomislavstankovic.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.tomislavstankovic.com\/blog\/node-js-restful-api-upload-datoteka\/#primaryimage"},"image":{"@id":"https:\/\/www.tomislavstankovic.com\/blog\/node-js-restful-api-upload-datoteka\/#primaryimage"},"thumbnailUrl":"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/01\/RESTful-API-with-PHP.jpg","datePublished":"2017-01-15T12:01:04+00:00","dateModified":"2019-01-05T17:58:20+00:00","breadcrumb":{"@id":"https:\/\/www.tomislavstankovic.com\/blog\/node-js-restful-api-upload-datoteka\/#breadcrumb"},"inLanguage":"hr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.tomislavstankovic.com\/blog\/node-js-restful-api-upload-datoteka\/"]}]},{"@type":"ImageObject","inLanguage":"hr","@id":"https:\/\/www.tomislavstankovic.com\/blog\/node-js-restful-api-upload-datoteka\/#primaryimage","url":"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/01\/RESTful-API-with-PHP.jpg","contentUrl":"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/01\/RESTful-API-with-PHP.jpg","width":825,"height":510,"caption":"Node.js RESTful API za upload datoteka"},{"@type":"BreadcrumbList","@id":"https:\/\/www.tomislavstankovic.com\/blog\/node-js-restful-api-upload-datoteka\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Po\u010detna stranica","item":"https:\/\/www.tomislavstankovic.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Node.js RESTful API za upload datoteka"}]},{"@type":"WebSite","@id":"https:\/\/www.tomislavstankovic.com\/blog\/#website","url":"https:\/\/www.tomislavstankovic.com\/blog\/","name":"Tomislav Stankovi\u0107","description":"Sam svoj bloger","publisher":{"@id":"https:\/\/www.tomislavstankovic.com\/blog\/#\/schema\/person\/0329c549c57700034ea77f5d3d78396d"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.tomislavstankovic.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"hr"},{"@type":["Person","Organization"],"@id":"https:\/\/www.tomislavstankovic.com\/blog\/#\/schema\/person\/0329c549c57700034ea77f5d3d78396d","name":"Tomislav Stankovi\u0107","image":{"@type":"ImageObject","inLanguage":"hr","@id":"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2019\/10\/cropped-TomislavStankovic.jpg","url":"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2019\/10\/cropped-TomislavStankovic.jpg","contentUrl":"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2019\/10\/cropped-TomislavStankovic.jpg","width":248,"height":165,"caption":"Tomislav Stankovi\u0107"},"logo":{"@id":"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2019\/10\/cropped-TomislavStankovic.jpg"},"description":"Bloger \u0161irokog raspona interesa od kojih dio voli objaviti na ovom blogu. U neslobodno vrijeme Angular developer mobilnih i web aplikacija.","sameAs":["https:\/\/www.tomislavstankovic.com\/blog\/","https:\/\/www.linkedin.com\/in\/tomislavstankovic\/"],"url":"https:\/\/www.tomislavstankovic.com\/blog\/author\/tomislavstankovic\/"}]}},"_links":{"self":[{"href":"https:\/\/www.tomislavstankovic.com\/blog\/wp-json\/wp\/v2\/posts\/4637","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tomislavstankovic.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tomislavstankovic.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tomislavstankovic.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tomislavstankovic.com\/blog\/wp-json\/wp\/v2\/comments?post=4637"}],"version-history":[{"count":31,"href":"https:\/\/www.tomislavstankovic.com\/blog\/wp-json\/wp\/v2\/posts\/4637\/revisions"}],"predecessor-version":[{"id":6440,"href":"https:\/\/www.tomislavstankovic.com\/blog\/wp-json\/wp\/v2\/posts\/4637\/revisions\/6440"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.tomislavstankovic.com\/blog\/wp-json\/wp\/v2\/media\/4639"}],"wp:attachment":[{"href":"https:\/\/www.tomislavstankovic.com\/blog\/wp-json\/wp\/v2\/media?parent=4637"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tomislavstankovic.com\/blog\/wp-json\/wp\/v2\/categories?post=4637"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tomislavstankovic.com\/blog\/wp-json\/wp\/v2\/tags?post=4637"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}